008-Lua 函数详解

在 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
  • 闭包中的 countcounter 函数的局部变量,但在返回的匿名函数中仍然可以访问。

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 定义局部函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小宝哥Code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值