Skip to content

函数

函数是 Lua 中的第一类值,它可以存储在变量中,作为参数传递,或作为返回值。本章节将介绍 Lua 中函数的定义、调用和相关特性。

函数定义

在 Lua 中,函数可以通过两种方式定义:

方式一:使用 function 关键字

lua
function add(a, b)
  return a + b
end

方式二:使用变量赋值

lua
local add = function(a, b)
  return a + b
end

函数调用

函数调用使用圆括号:

lua
local result = add(10, 5)
print(result)  -- 输出 15

如果函数只有一个参数,且参数是字符串或表,可以省略圆括号:

lua
print "Hello"  -- 等同于 print("Hello")

local t = {1, 2, 3}
table.insert t, 4  -- 等同于 table.insert(t, 4)

函数参数

基本参数

lua
function greet(name)
  print("Hello, " .. name .. "!")
end

greet("Lua")  -- 输出 Hello, Lua!

可变参数

使用 ... 表示可变参数:

lua
function sum(...)
  local total = 0
  for _, v in ipairs({...}) do
    total = total + v
  end
  return total
end

print(sum(1, 2, 3, 4, 5))  -- 输出 15

命名参数

Lua 没有内置的命名参数,但可以使用表来模拟:

lua
function person(info)
  local name = info.name or "匿名"
  local age = info.age or 0
  print("姓名:" .. name .. ",年龄:" .. age)
end

person({name = "张三", age = 30})  -- 输出 姓名:张三,年龄:30
person({name = "李四"})  -- 输出 姓名:李四,年龄:0

函数返回值

单个返回值

lua
function add(a, b)
  return a + b
end

local result = add(10, 5)
print(result)  -- 输出 15

多个返回值

Lua 函数可以返回多个值:

lua
function getMinMax(a, b, c)
  local min = math.min(a, b, c)
  local max = math.max(a, b, c)
  return min, max
end

local min, max = getMinMax(10, 5, 15)
print(min, max)  -- 输出 5  15

忽略返回值

使用下划线 _ 忽略不需要的返回值:

lua
local _, max = getMinMax(10, 5, 15)
print(max)  -- 输出 15

函数作为值

函数是 Lua 中的第一类值,可以存储在变量中:

lua
local add = function(a, b)
  return a + b
end

local operation = add
print(operation(10, 5))  -- 输出 15

函数作为参数

函数可以作为参数传递给其他函数:

lua
function map(t, f)
  local result = {}
  for i, v in ipairs(t) do
    result[i] = f(v)
  end
  return result
end

local numbers = {1, 2, 3, 4, 5}
local doubled = map(numbers, function(x)
  return x * 2
end)

for i, v in ipairs(doubled) do
  print(v)  -- 输出 2, 4, 6, 8, 10
end

函数作为返回值

函数可以作为返回值:

lua
function createCounter()
  local count = 0
  return function()
    count = count + 1
    return count
  end
end

local counter = createCounter()
print(counter())  -- 输出 1
print(counter())  -- 输出 2
print(counter())  -- 输出 3

闭包

闭包是指一个函数可以访问其定义环境中的变量:

lua
function createAdder(x)
  return function(y)
    return x + y
  end
end

local add5 = createAdder(5)
print(add5(10))  -- 输出 15

local add10 = createAdder(10)
print(add10(10))  -- 输出 20

递归函数

函数可以递归调用自身:

lua
function factorial(n)
  if n == 0 then
    return 1
  else
    return n * factorial(n - 1)
  end
end

print(factorial(5))  -- 输出 120

尾递归

尾递归是指函数的最后一个操作是调用自身,Lua 会对尾递归进行优化,避免栈溢出:

lua
function factorial(n, acc)
  acc = acc or 1
  if n == 0 then
    return acc
  else
    return factorial(n - 1, n * acc)
  end
end

print(factorial(1000))  -- 不会栈溢出

小结

本章节介绍了 Lua 中函数的定义、调用、参数、返回值、函数作为值、函数作为参数、函数作为返回值、闭包、递归函数和尾递归等内容。掌握这些内容,对于编写 Lua 程序非常重要。