<返回目录     Powered by claud/xia兄

第5课: 函数基础

函数概述

函数是Lua中的第一类值(first-class values),这意味着函数可以像其他值一样被赋值、传递、返回。理解函数的内部实现和特性对于编写高效、模块化的代码至关重要。

Lua函数的设计哲学:

函数定义与调用

Lua提供了多种定义函数的方式,理解这些方式的区别和适用场景很重要。

基本函数定义

函数定义的多种方式

函数定义方式对比:

函数调用的深入理解

函数调用的内部机制:

函数调用的执行流程:

  1. 创建新的调用栈帧
  2. 将参数压入栈中
  3. 跳转到函数体执行
  4. 执行函数体代码
  5. 将返回值压入栈中
  6. 销毁调用栈帧
  7. 返回到调用点

多返回值

Lua函数可以返回多个值,这是Lua的特色功能之一。理解多返回值的规则和使用场景非常重要。

基本多返回值

多返回值的规则

多返回值的处理规则:

多返回值的实际应用

可变参数

Lua支持可变参数函数,允许函数接受任意数量的参数。理解可变参数的处理方式对于编写灵活的函数很重要。

基本可变参数

可变参数的深入理解

可变参数的处理方式:

可变参数的实际应用

 maxValue then
            maxValue = v
        end
    end
    return maxValue
end

print(max(1, 5, 3, 9, 2))  -- 9

-- 函数组合
local function compose(f, g)
    return function(...)
        return f(g(...))
    end
end

local function double(x) return x * 2 end
local function addOne(x) return x + 1 end

local doubleThenAddOne = compose(addOne, double)
local addOneThenDouble = compose(double, addOne)

print(doubleThenAddOne(5))  -- 11 (5*2+1)
print(addOneThenDouble(5))  -- 12 ((5+1)*2)

匿名函数

匿名函数是没有名称的函数,通常作为值传递给其他函数或赋值给变量。理解匿名函数的使用场景对于编写函数式风格的代码很重要。

基本匿名函数

匿名函数的实际应用

闭包

闭包是函数式编程的重要概念,指函数可以访问定义时的外部变量。理解闭包的原理和应用对于编写模块化、安全的代码至关重要。

基本闭包

闭包的深入理解

闭包的内部机制:

闭包由两部分组成:

当闭包被创建时,它会捕获定义时的外部变量。即使外部函数已经返回,闭包仍然可以访问这些变量。

闭包的实际应用

局部函数

局部函数的作用域限制在定义的块内,避免污染全局命名空间。理解局部函数的作用域和递归调用很重要。

基本局部函数

局部函数的作用域

局部函数的作用域规则:

尾调用优化

尾调用优化是Lua的重要特性,可以避免递归导致的栈溢出。理解尾调用的条件和优化机制对于编写高效的递归函数至关重要。

基本尾调用

尾调用的条件

尾调用的条件:

要成为尾调用,必须满足以下条件:

尾调用优化会重用当前栈帧,而不是创建新的栈帧。

综合示例

重要提示:
练习题:
  1. 编写函数计算圆的面积和周长(返回两个值)
  2. 实现一个可变参数函数,计算所有参数的平均值
  3. 使用闭包实现一个简单的计数器
  4. 编写递归函数计算斐波那契数列(使用尾调用优化)
  5. 实现一个高阶函数,接受函数和列表,返回新列表
  6. 使用闭包实现一个简单的缓存机制
  7. 编写函数解析URL,返回协议、域名、路径等
  8. 实现一个简单的表达式求值器,支持加减乘除
  9. 使用匿名函数实现表的自定义排序
  10. 编写函数工厂,创建不同配置的函数