《Lua快速入门》3.函数与模块
函数与模块
1. 函数的定义与调用
1.1 函数的基本概念
函数是 Lua 中的一等公民,可以像变量一样被赋值、传递和返回。函数的主要作用是将代码模块化,提高代码的复用性和可读性。
1.2 函数的定义
Lua 使用 function 关键字定义函数,语法如下:
function function_name(arg1, arg2, ...)
-- 函数体
return result
end
示例:
function add(a, b)
return a + b
end
print(add(10, 20)) -- 输出: 30
1.3 函数的调用
函数通过函数名和参数列表调用。Lua 支持多返回值,函数可以返回多个值。
function swap(a, b)
return b, a
end
local x, y = swap(10, 20)
print(x, y) -- 输出: 20 10
1.4 函数的参数
- 固定参数:函数可以接受固定数量的参数。
- 可变参数:使用
...表示可变参数,通过{...}或select("#", ...)获取参数。
function sum(...)
local result = 0
for _, v in ipairs({...}) do
result = result + v
end
return result
end
print(sum(1, 2, 3, 4)) -- 输出: 10
1.5 函数的返回值
- 函数可以返回多个值,用逗号分隔。
- 如果函数没有显式返回值,则返回
nil。
function max(a, b)
if a > b then
return a
else
return b
end
end
print(max(10, 20)) -- 输出: 20
2. 匿名函数和闭包
2.1 匿名函数
匿名函数是没有名称的函数,可以直接赋值给变量或作为参数传递。
local add = function(a, b)
return a + b
end
print(add(10, 20)) -- 输出: 30
2.2 闭包
闭包是指一个函数可以访问其外部作用域中的变量,即使外部函数已经执行完毕。
function createCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = createCounter()
print(counter()) -- 输出: 1
print(counter()) -- 输出: 2
2.3 闭包的应用
- 状态保持:闭包可以用于保存函数的状态。
- 回调函数:闭包可以作为回调函数传递给其他函数。
function createAdder(x)
return function(y)
return x + y
end
end
local add5 = createAdder(5)
print(add5(10)) -- 输出: 15
3. Lua 的模块与包管理
3.1 模块的概念
模块是将相关函数和变量组织在一起的方式,通常存储在一个独立的 Lua 文件中。模块可以提高代码的可维护性和复用性。
3.2 创建模块
一个模块通常是一个表,包含函数和变量。模块文件以 .lua 为扩展名。
-- mymodule.lua
local M = {} -- 模块表
function M.add(a, b)
return a + b
end
function M.sub(a, b)
return a - b
end
return M -- 返回模块表
3.3 使用模块
使用 require 函数加载模块,模块文件需要放在 Lua 的模块搜索路径中。
local mymodule = require("mymodule")
print(mymodule.add(10, 20)) -- 输出: 30
3.4 模块搜索路径
Lua 通过 package.path 和 package.cpath 查找模块文件。可以通过修改这两个变量来添加自定义路径。
package.path = package.path .. ";./?.lua"
local mymodule = require("mymodule")
3.5 包管理工具(LuaRocks)
LuaRocks 是 Lua 的包管理工具,用于安装和管理第三方模块。
3.5.1 安装 LuaRocks
- 在 Linux 上:
sudo apt-get install luarocks - 在 macOS 上:
brew install luarocks
3.5.2 使用 LuaRocks 安装模块
luarocks install luasocket
3.5.3 使用 LuaRocks 管理模块
- 列出已安装的模块:
luarocks list - 卸载模块:
luarocks remove luasocket
4. 总结
函数与模块是 Lua 编程的核心内容。通过函数,可以将代码模块化,提高代码的复用性和可读性;通过模块,可以将相关功能组织在一起,便于管理和维护。掌握这些知识后,您可以编写更加复杂和高效的 Lua 程序。