Skip to content

Lua 函数

函数(Function)是一个可重用代码块,用于执行特定任务。函数有助于组织代码,使其更具模块化,并减少冗余。Lua 对函数提供了出色的支持,将其视为“头等公民”(first-class citizens),这意味着它们可以存储在变量中、作为参数传递,并从其他函数中返回。

Lua 提供了许多内置函数(例如 print()、type()、pairs()),您也可以轻松定义自己的函数。

在 Lua 中定义函数的一般语法是:

[local] function function_name (parameter1, parameter2, ...)
-- 函数体:执行任务的语句
[return value1, value2, ...] -- 可选的 return 语句
end

函数定义的主要部分:

  • local(可选作用域): 使用 local function ... 使函数成为当前块/文件的局部(local)函数。省略 local 则使其成为全局(global)函数(通常不鼓励这样做,除非有意为之,为了更好的模块化)。
  • function 关键字: 表示函数定义的开始。
  • function_name: 用于调用函数的名称。
  • 参数(Parameters,例如 parameter1): 接收调用函数时传递的值的变量。这些变量在函数内部是局部的。
  • 函数体(Function Body): 调用函数时执行的 Lua 语句。
  • return(可选): 指定函数返回给调用者的值。Lua 函数可以返回多个值,用逗号分隔。

此函数接受两个数字并返回较大的一个:

local function max(num1, num2)
if num1 > num2 then
return num1
else
return num2
end
end
-- 一种使用 Lua 'and/or' 技巧的更简洁方式(对初学者来说可读性较差):
-- local function max_concise(num1, num2)
-- return num1 > num2 and num1 or num2
-- end

参数(Parameters)是函数期望接收的值的占位符。当您调用函数时,您传递的值称为实参(Arguments)。这些实参会被赋值给函数的参数。参数在函数内部的行为类似于局部变量。

要执行函数,您需要通过其名称后跟括号 () 来调用它。如果函数期望接收实参,您需要在括号内提供它们。

调用函数时,程序控制会转移到该函数。函数完成后(无论是通过到达其 end 还是通过 return 语句),控制会返回到调用它的位置。如果函数返回了值,可以将它们赋值给变量。

调用 max 函数的示例:

local function max(num1, num2)
if num1 > num2 then
return num1
else
return num2
end
end
local result1 = max(10, 4)
print("The maximum of 10 and 4 is: " .. result1) -- 输出: 10 和 4 的最大值是: 10
local result2 = max(5, 6)
print("The maximum of 5 and 6 is: " .. result2) -- 输出: 5 和 6 的最大值是: 6

Lua 函数可以返回多个值。这是一个强大的特性。

local function get_coordinates()
local x = 10
local y = 20
local z = 30
return x, y, z -- 返回三个值
end
local cx, cy, cz = get_coordinates() -- 赋值所有返回值
print(string.format("Coordinates: X=%d, Y=%d, Z=%d", cx, cy, cz)) -- X=10, Y=20, Z=30
local first_val = get_coordinates() -- 只赋值第一个返回值
print("First coordinate:", first_val) -- 第一个坐标: 10
-- 如果函数调用是表达式列表中的最后一个(或唯一一个)表达式,
-- 则其所有返回值都会被使用:
local t = {get_coordinates(), 40} -- t 将是 {10, 20, 30, 40}
print("Table t:", t[1], t[2], t[3], t[4])

赋值和传递函数(头等公民函数)

Section titled “赋值和传递函数(头等公民函数)”

在 Lua 中,函数是头等值(first-class values)。这意味着您可以:

  • 将函数赋值给变量。
  • 将函数作为实参传递给其他函数。
  • 从其他函数中返回函数。
  • 将函数存储在表中(table)。

示例:

-- 将函数赋值给变量
local function greet(name)
return "Hello, " .. name .. "!"
end
local my_greeting_func = greet
print(my_greeting_func("Alice")) -- 输出: Hello, Alice!
-- 将函数作为实参传递
local function operate(num1, num2, operation_func)
return operation_func(num1, num2)
end
local function add(a, b)
return a + b
end
local function multiply(a, b)
return a * b
end
local sum_result = operate(5, 3, add)
print("Sum:", sum_result) -- 输出: Sum: 8
local product_result = operate(5, 3, multiply)
print("Product:", product_result) -- 输出: Product: 15

可变参数函数(Variadic Functions)

Section titled “可变参数函数(Variadic Functions)”

Lua 允许您定义接受可变数量实参(variable number of arguments)的函数,方法是在函数参数列表的最后一个参数中使用三个点 (...)。在函数内部,这些实参可以通过 select() 作为列表或单独访问,或者使用 {...} 将它们打包到一个表中。

示例:一个计算数字平均值的函数。

local function average(...)
local arg_table = {...} -- 将所有实参打包到表中
local sum = 0
local count = #arg_table -- 获取实参数量
if count == 0 then
return 0 -- 或者作为错误处理
end
for i = 1, count do
sum = sum + arg_table[i]
end
return sum / count
end
print("Average of 10, 5, 3, 4, 5, 6 is:", average(10, 5, 3, 4, 5, 6)) -- 输出: 5.5
print("Average of 1, 2, 3 is:", average(1, 2, 3)) -- 输出: 2.0
print("Average of no numbers is:", average()) -- 输出: 0
-- 使用 select 获取实参数量和单独的实参
local function print_all(...)
local n = select('#', ...) -- 获取实参数量
print("Number of arguments:", n)
for i = 1, n do
local arg_val = select(i, ...) -- 获取第 i 个实参
print(string.format("Argument %d: %s", i, tostring(arg_val)))
end
end
print_all("Hello", 42, true)

更多资源:函数是 Lua 编程的基石。官方的 Lua 参考手册提供了关于其语法、作用域(scope)规则以及闭包(closures)等高级特性的详细信息。