元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
Lua语言基础
▶
环境搭建
安装Lua解释器
配置开发环境
第一个Lua程序
▶
基本语法
变量与数据类型
运算符与表达式
控制结构
▶
数据结构
表(Table)详解
数组与迭代
字符串处理
▶
Lua高级编程
▶
函数编程
函数定义与调用
闭包与作用域
高阶函数应用
▶
元表与元方法
元表基础
操作符重载
继承与对象系统
▶
协程编程
协程基础
生产者-消费者模式
协程调度实践
▶
Lua应用实践
▶
游戏开发
Lua与游戏引擎集成
AI脚本实现
热更新机制
▶
系统编程
Lua与C交互
扩展库开发
性能优化技巧
▶
实用工具开发
配置文件解析
自动化测试框架
网络编程基础
发布时间:
2025-03-24 12:03
↑
☰
# Lua函数定义与调用 本文将介绍Lua中函数的定义和调用方式,帮助你理解如何组织和重用代码。 ## 函数基础 ### 1. 函数定义 ```lua -- 基本函数定义 local function sayHello(name) print("Hello, " .. name .. "!") end -- 匿名函数 local greet = function(name) print("Welcome, " .. name .. "!") end -- 全局函数 function globalHello(name) print("Hello from global, " .. name .. "!") end ``` ### 2. 函数调用 ```lua -- 基本调用 sayHello("Alice") -- 输出:Hello, Alice! -- 通过变量调用 greet("Bob") -- 输出:Welcome, Bob! -- 调用全局函数 globalHello("Charlie") -- 输出:Hello from global, Charlie! ``` ## 参数传递 ### 1. 位置参数 ```lua -- 多个参数 local function add(a, b) return a + b end print(add(10, 20)) -- 输出:30 -- 可变参数 local function sum(...) local result = 0 for _, v in ipairs({...}) do result = result + v end return result end print(sum(1, 2, 3, 4)) -- 输出:10 ``` ### 2. 默认参数 ```lua -- 使用或运算符实现默认参数 local function greetUser(name, greeting) greeting = greeting or "Hello" return greeting .. ", " .. name .. "!" end print(greetUser("Alice")) -- 输出:Hello, Alice! print(greetUser("Bob", "Hi")) -- 输出:Hi, Bob! ``` ### 3. 命名参数 ```lua -- 使用表实现命名参数 local function createPerson(params) return { name = params.name or "Anonymous", age = params.age or 0, city = params.city or "Unknown" } end local person = createPerson({ name = "Alice", age = 25, city = "Beijing" }) ``` ## 返回值 ### 1. 单个返回值 ```lua -- 返回单个值 local function square(x) return x * x end local result = square(5) -- result = 25 ``` ### 2. 多个返回值 ```lua -- 返回多个值 local function getNameAndAge() return "Alice", 25 end local name, age = getNameAndAge() print(name, age) -- 输出:Alice 25 -- 忽略部分返回值 local name2 = getNameAndAge() -- 只获取第一个返回值 -- 在表达式中使用多返回值 local function getNumbers() return 1, 2, 3 end local sum = getNumbers() + 10 -- 只使用第一个返回值:1 + 10 ``` ### 3. 可变返回值 ```lua -- 返回可变数量的值 local function split(str, sep) local results = {} for match in string.gmatch(str, "[^" .. sep .. "]+") do table.insert(results, match) end return table.unpack(results) end local a, b, c = split("a,b,c", ",") print(a, b, c) -- 输出:a b c ``` ## 函数作为值 ### 1. 函数作为参数 ```lua -- 高阶函数 local function operate(x, y, func) return func(x, y) end -- 传递函数作为参数 local result1 = operate(10, 20, function(a, b) return a + b end) local result2 = operate(10, 20, function(a, b) return a * b end) print(result1) -- 输出:30 print(result2) -- 输出:200 ``` ### 2. 返回函数 ```lua -- 工厂函数 local function makeMultiplier(factor) return function(x) return x * factor end end local double = makeMultiplier(2) local triple = makeMultiplier(3) print(double(5)) -- 输出:10 print(triple(5)) -- 输出:15 ``` ### 3. 函数表 ```lua -- 将函数存储在表中 local operations = { add = function(a, b) return a + b end, sub = function(a, b) return a - b end, mul = function(a, b) return a * b end, div = function(a, b) return a / b end } -- 使用函数表 print(operations.add(10, 20)) -- 输出:30 print(operations.mul(10, 20)) -- 输出:200 ``` ## 常见问题解答 ### Q1: 局部函数和全局函数的区别? ```lua -- 局部函数 local function localFunc() print("局部函数") end -- 全局函数 function globalFunc() print("全局函数") end ``` 区别: - 局部函数只在其定义的作用域内可见 - 全局函数在任何地方都可以访问 - 局部函数性能更好,推荐使用 ### Q2: 如何处理可选参数? ```lua -- 方法1:使用或运算符 local function greet(name, greeting) greeting = greeting or "Hello" print(greeting .. ", " .. name) end -- 方法2:使用表 local function createUser(params) params = params or {} return { name = params.name or "Anonymous", age = params.age or 0 } end ``` ### Q3: 如何确保函数参数类型正确? ```lua -- 使用assert进行参数检查 local function divide(a, b) assert(type(a) == "number", "First argument must be a number") assert(type(b) == "number", "Second argument must be a number") assert(b ~= 0, "Cannot divide by zero") return a / b end ``` ## 下一步 现在你已经掌握了Lua的函数定义和调用,可以继续学习[闭包与作用域](/article/lua/advanced/closures)来深入理解Lua的函数特性。 ## 参考资源 - [Lua 5.4 参考手册 - 函数](http://www.lua.org/manual/5.4/manual.html#3.4.10) - [Programming in Lua - 函数](http://www.lua.org/pil/5.html) - [Lua函数编程](http://www.lua.org/pil/6.html)