On this page

Lua 函数

Lua 函数全面指南

函数是 Lua 编程的核心构建块,具有高度灵活性。以下是 Lua 函数的完整介绍:

1. 函数定义

基础定义

-- 全局函数
function add(a, b)
    return a + b
end

-- 局部函数
local function multiply(a, b)
    return a * b
end

匿名函数(Lambda)

local square = function(x)
    return x * x
end
print(square(5))  -- 输出: 25

2. 函数调用

常规调用

print(add(3, 4))  -- 输出: 7

方法调用(使用冒号)

local obj = {
    value = 10,
    increment = function(self, amount)
        self.value = self.value + amount
    end
}

obj:increment(5)  -- 等价于 obj.increment(obj, 5)
print(obj.value)  -- 输出: 15

3. 参数处理

可变参数

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 createUser(options)
    local name = options.name or "Anonymous"
    local age = options.age or 18
    print(name, age)
end

createUser{name="Alice", age=25}  -- 输出: Alice   25

4. 返回值

多返回值

function minMax(arr)
    local min, max = math.huge, -math.huge
    for _, v in ipairs(arr) do
        min = math.min(min, v)
        max = math.max(max, v)
    end
    return min, max
end

local lowest, highest = minMax({3,1,4,1,5,9})

返回值调整

function process()
    return 1, 2, 3
end

local a, b = process()  -- a=1, b=2 (第三个值被丢弃)
local c = process()     -- c=1 (只取第一个)
local d, e, f, g = process()  -- d=1,e=2,f=3,g=nil

5. 高阶函数

函数作为参数

function apply(func, a, b)
    return func(a, b)
end

local result = apply(function(x,y) return x^y end, 2, 3)
print(result)  -- 输出: 8

返回函数

function makeAdder(x)
    return function(y) return x + y end
end

local add5 = makeAdder(5)
print(add5(3))  -- 输出: 8

6. 闭包(Closures)

function counter()
    local count = 0
    return function()
        count = count + 1
        return count
    end
end

local c = counter()
print(c())  -- 输出: 1
print(c())  -- 输出: 2

7. 尾调用优化

当函数的最后动作是调用另一个函数时,Lua 会进行优化:

function foo(n)
    if n <= 0 then return 0 end
    return foo(n - 1)  -- 尾调用
end

8. 函数式编程技巧

映射(map)

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

local squared = map({1,2,3}, function(x) return x*x end)

过滤(filter)

function filter(t, pred)
    local result = {}
    for _, v in ipairs(t) do
        if pred(v) then
            table.insert(result, v)
        end
    end
    return result
end

local evens = filter({1,2,3,4}, function(x) return x%2==0 end)

9. 调试相关

获取函数信息

function example()
    -- 获取调用信息
    local info = debug.getinfo(1)
    print(info.name)      -- 函数名
    print(info.linedefined) -- 定义行号
end

10. 性能优化

  1. 局部化常用函数

    local print = print  -- 减少全局表访问
    
  2. 避免在循环中创建函数

    -- 不好
    for i = 1, 100 do
        local f = function() return i end  -- 每次循环创建新函数
    end
       
    -- 好
    local func
    for i = 1, 100 do
        func = function() return i end  -- 复用函数
    end
    
  3. 使用尾调用减少栈消耗

Lua 的函数系统既简单又强大,支持多种编程范式。掌握这些特性可以让你写出更灵活、更高效的 Lua 代码。