在 Lua 中,函数是非常重要的基础单位。Lua 的函数是一等公民,支持匿名函数、闭包、作为参数传递和返回值等特性。以下是 Lua 函数的详细介绍,包括定义、调用、参数、返回值、匿名函数、闭包和递归等内容。
1. 什么是函数?
函数是一组可以被多次调用的代码块,用于执行特定任务。在 Lua 中,函数也是一种数据类型,可以赋值给变量、作为参数传递或返回值。
2. 定义函数
在 Lua 中,可以使用关键字 function
来定义一个函数。
语法
function 函数名(参数1, 参数2, ...)
-- 函数体
return 返回值
end
示例
function greet(name)
print("Hello, " .. name)
end
greet("Lua") -- 输出:Hello, Lua
3. 函数调用
函数调用的方式非常简单,只需使用函数名加括号并传入参数即可。
示例
function add(a, b)
return a + b
end
result = add(5, 10)
print(result) -- 输出:15
4. 函数参数
Lua 的函数支持任意数量的参数,参数可以是任何类型。
4.1 普通参数
function multiply(a, b)
return a * b
end
print(multiply(3, 4)) -- 输出:12
4.2 默认参数
Lua 不支持直接定义默认参数,但可以通过判断参数是否为 nil
来实现。
function greet(name)
name = name or "World" -- 如果 name 为 nil,则设置为 "World"
print("Hello, " .. name)
end
greet("Lua") -- 输出:Hello, Lua
greet() -- 输出:Hello, World
4.3 可变参数
Lua 支持可变参数(...
),可以在函数中接收不定数量的参数。
语法
function 函数名(...)
-- 使用 {...} 捕获所有参数
end
示例
function sum(...)
local total = 0
for _, v in ipairs({...}) do
total = total + v
end
return total
end
print(sum(1, 2, 3, 4)) -- 输出:10
5. 函数返回值
Lua 的函数可以返回多个值。
5.1 单个返回值
function square(x)
return x * x
end
print(square(5)) -- 输出:25
5.2 多个返回值
使用逗号分隔多个返回值。
function divide(a, b)
return a // b, a % b -- 返回商和余数
end
quotient, remainder = divide(10, 3)
print(quotient, remainder) -- 输出:3 1
5.3 捕获部分返回值
可以选择捕获部分返回值。
_, remainder = divide(10, 3) -- 忽略第一个返回值
print(remainder) -- 输出:1
6. 匿名函数
Lua 支持定义匿名函数(没有名称的函数)。
语法
function(参数1, 参数2, ...)
-- 函数体
return 返回值
end
示例
-- 定义匿名函数并赋值给变量
add = function(a, b)
return a + b
end
print(add(3, 4)) -- 输出:7
匿名函数常用于回调函数或作为参数传递。
示例:回调函数
function apply(func, x, y)
return func(x, y)
end
result = apply(function(a, b) return a * b end, 3, 4)
print(result) -- 输出:12
7. 闭包
Lua 的闭包是函数和其定义时的环境的组合。当一个函数可以访问其外层函数的局部变量时,就形成了闭包。
示例
function counter()
local count = 0
return function()
count = count + 1
return count
end
end
c = counter()
print(c()) -- 输出:1
print(c()) -- 输出:2
print(c()) -- 输出:3
- 闭包中的
count
是counter
函数的局部变量,但在返回的匿名函数中仍然可以访问。
8. 递归函数
递归函数是指函数调用自身,用于解决分而治之的问题。需要注意递归的终止条件,否则会导致无限递归。
示例:计算阶乘
function factorial(n)
if n == 0 then
return 1
else
return n * factorial(n - 1)
end
end
print(factorial(5)) -- 输出:120
9. 高阶函数
高阶函数是指可以接受函数作为参数,或者返回函数的函数。Lua 的函数是一等公民,因此可以轻松实现高阶函数。
示例:函数作为参数
function apply(func, x)
return func(x)
end
double = function(a) return a * 2 end
print(apply(double, 5)) -- 输出:10
示例:函数作为返回值
function multiplier(factor)
return function(x)
return x * factor
end
end
double = multiplier(2)
print(double(5)) -- 输出:10
10. 函数作为表的方法
Lua 支持将函数作为表的方法,通过 :
来调用。
示例
person = {}
function person:speak()
print("Hello, I am a person!")
end
person:speak() -- 输出:Hello, I am a person!
11. 函数的作用域
- 全局函数:默认情况下,定义的函数是全局的。
- 局部函数:使用
local
关键字定义的函数是局部的,只在当前作用域内可见。
示例
-- 全局函数
function global_func()
print("这是一个全局函数")
end
-- 局部函数
local function local_func()
print("这是一个局部函数")
end
global_func() -- 可以调用
-- local_func() -- 在函数外无法调用
12. 示例整合
-- 定义函数
function greet(name)
name = name or "World"
print("Hello, " .. name)
end
-- 调用函数
greet("Lua") -- 输出:Hello, Lua
greet() -- 输出:Hello, World
-- 可变参数函数
function sum(...)
local total = 0
for _, v in ipairs({...}) do
total = total + v
end
return total
end
print(sum(1, 2, 3, 4)) -- 输出:10
-- 闭包
function counter()
local count = 0
return function()
count = count + 1
return count
end
end
c = counter()
print(c()) -- 输出:1
print(c()) -- 输出:2
-- 高阶函数
function multiplier(factor)
return function(x)
return x * factor
end
end
double = multiplier(2)
print(double(10)) -- 输出:20
13. 小结
功能 | 描述 |
---|---|
函数定义 | 使用 function 关键字定义函数。 |
参数 | 支持普通参数、默认参数和可变参数。 |
返回值 | 支持返回一个或多个值。 |
匿名函数 | 可以定义没有名称的函数,常用于回调函数。 |
闭包 | 函数可以访问其外层函数的局部变量,形成闭包。 |
递归 | 函数调用自身,用于解决分而治之的问题。 |
高阶函数 | 函数可以作为参数传递或返回值,支持函数式编程。 |
全局与局部函数 | 默认函数是全局的,使用 local 定义局部函数。 |