Lua 函数
Lua - 函数
Section titled “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 函数可以返回多个值,用逗号分隔。
示例:一个简单的 max 函数
Section titled “示例:一个简单的 max 函数”此函数接受两个数字并返回较大的一个:
local function max(num1, num2) if num1 > num2 then return num1 else return num2 endend
-- 一种使用 Lua 'and/or' 技巧的更简洁方式(对初学者来说可读性较差):-- local function max_concise(num1, num2)-- return num1 > num2 and num1 or num2-- end函数参数(Arguments)
Section titled “函数参数(Arguments)”参数(Parameters)是函数期望接收的值的占位符。当您调用函数时,您传递的值称为实参(Arguments)。这些实参会被赋值给函数的参数。参数在函数内部的行为类似于局部变量。
要执行函数,您需要通过其名称后跟括号 () 来调用它。如果函数期望接收实参,您需要在括号内提供它们。
调用函数时,程序控制会转移到该函数。函数完成后(无论是通过到达其 end 还是通过 return 语句),控制会返回到调用它的位置。如果函数返回了值,可以将它们赋值给变量。
调用 max 函数的示例:
local function max(num1, num2) if num1 > num2 then return num1 else return num2 endend
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 的最大值是: 6Lua 函数可以返回多个值。这是一个强大的特性。
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 = greetprint(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 + bend
local function multiply(a, b) return a * bend
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 / countend
print("Average of 10, 5, 3, 4, 5, 6 is:", average(10, 5, 3, 4, 5, 6)) -- 输出: 5.5print("Average of 1, 2, 3 is:", average(1, 2, 3)) -- 输出: 2.0print("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))) endend
print_all("Hello", 42, true)更多资源:函数是 Lua 编程的基石。官方的 Lua 参考手册提供了关于其语法、作用域(scope)规则以及闭包(closures)等高级特性的详细信息。