news 2026/4/15 6:57:51

Lua 函数教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Lua 函数教程

Lua 函数

1. 课程信息

  • 课题:Lua 函数基础与进阶用法
  • 课时建议:60 ~ 90 分钟
  • 适合对象:已掌握 Lua 变量、流程控制(if/for/while)与table基础的学习者

2. 教学目标

  • 理解函数的作用:封装逻辑、复用代码、提升可读性
  • 掌握定义与调用function ... end、匿名函数、局部/全局函数
  • 掌握参数与返回值:多返回值、可变参数(...)、选择性接收
  • 理解 Lua 的“函数是一等公民”:函数可赋值、可作为参数、可作为返回值
  • 能写出可维护的函数:明确输入输出、处理边界、合理命名

3. 知识要点

3.1 函数的定义与调用

Lua 中最常见的写法:

-- global function (not recommended in big projects)functionadd(a,b)returna+bendprint(add(2,3))-- 5

更推荐的局部函数:

localfunctionadd(a,b)returna+bendprint(add(2,3))
3.2 函数的本质:变量里装的值

下面两段代码等价:

localfunctionadd(a,b)returna+bend
localadd add=function(a,b)returna+bend

强调:函数就是一种值(和数字、字符串一样),因此可以赋值/传递。

3.3 参数与返回值
3.3.1 多参数、多返回值
localfunctiondivmod(a,b)returnmath.floor(a/b),a%bendlocalq,r=divmod(17,5)print(q,r)-- 3 2
3.3.2 只接收部分返回值
localfunctiondivmod(a,b)returnmath.floor(a/b),a%bendlocalq=divmod(17,5)print(q)-- 3 (only first return value)
3.3.3 返回值数量不固定的常见场景
  • string.find:找到了返回位置,没找到返回nil
  • 自己写函数时也可以:失败返回nil+ 错误信息
localfunctiontoNumber(s)localn=tonumber(s)ifn==nilthenreturnnil,"not a number"endreturnnendlocaln,err=toNumber("12x")print(n,err)-- nil not a number
3.4 可变参数(Varargs):...
localfunctionsum(...)localtotal=0fori=1,select("#",...)dolocalv=select(i,...)total=total+vendreturntotalendprint(sum(1,2,3,4))-- 10

要点:

  • ...表示所有传入的额外参数
  • select("#", ...)获取可变参数数量
  • select(i, ...)获取第i个参数
3.5 高阶函数:函数作为参数/返回值
3.5.1 函数作为参数(回调思想)
localfunctionapply(a,b,op)returnop(a,b)endlocalfunctionmul(x,y)returnx*yendprint(apply(2,3,mul))-- 6print(apply(2,3,function(x,y)returnx-yend))-- -1
3.5.2 返回函数(工厂函数)
localfunctionmakeAdder(step)returnfunction(x)returnx+stependendlocaladd10=makeAdder(10)print(add10(7))-- 17
3.6 闭包(Closure)与作用域

闭包:函数“记住”它被创建时所在的外部变量。

localfunctionmakeCounter()localcount=0returnfunction()count=count+1returncountendendlocalc1=makeCounter()print(c1())-- 1print(c1())-- 2localc2=makeCounter()print(c2())-- 1 (independent)

要点:

  • count是局部变量,但因为被内部函数引用,所以不会立刻释放
  • 适合实现计数器、缓存、封装私有状态
3.7:.的差异(面向对象常见)
localPlayer={}Player.__index=PlayerfunctionPlayer.new(name)returnsetmetatable({name=name},Player)endfunctionPlayer.say(self,msg)-- dot style requires explicit selfprint(self.name..": "..msg)endfunctionPlayer:say2(msg)-- colon style passes self implicitlyprint(self.name..": "..msg)endlocalp=Player.new("Alice")p.say(p,"hello")p:say2("hello")

规则:

  • obj:method(x)等价于obj.method(obj, x)
  • 定义时用function T:method(...),调用时也用:保持一致

4. 课堂演示(建议流程)

  • Step 1(5min):用“重复代码”的例子引出函数封装
  • Step 2(10min):讲local function与返回值
  • Step 3(15min):多返回值、nil + err的错误返回模式
  • Step 4(15min):可变参数...select
  • Step 5(15min):高阶函数与闭包(重点)
  • Step 6(10min):.的差异(结合 table + metatable 简单展示)

5. 练习题(课堂)

练习 1:写一个安全除法

实现safeDiv(a, b)

  • b == 0时返回nil, "division by zero"
  • 否则返回a / b
练习 2:实现map

实现map(arr, fn)

  • arr是数组 table
  • fn是函数:fn(value, index)
  • 返回一个新数组

示例:

  • 输入{1,2,3}function(v) return v*2 end
  • 输出{2,4,6}
练习 3:实现filter

实现filter(arr, pred)

  • pred(value, index)返回true/false
  • 返回符合条件的新数组

6. 作业(课后)

作业 1:实现一个缓存闭包

实现memoize(fn):返回一个新函数,能缓存fn的计算结果。

  • 只要求支持单个参数(key)即可
  • 缓存用 table 保存
作业 2:实现一个小型日志系统

实现makeLogger(prefix)

  • 返回一个函数log(msg)
  • 每次调用输出:prefix .. ": " .. msg
  • prefix由闭包保存

7. 常见坑总结

  • 多返回值丢失:把函数返回值放在表达式中(如拼接、作为参数)时,常只保留第一个返回值
  • 全局污染:缺少local容易污染全局命名空间
  • :.混用:定义用:却用.调用(或反过来)会导致self不正确
  • nil判断不严谨:失败返回时要同时返回nil, err,调用方要判断if not ok then ... end

8. 扩展阅读(建议)

  • Lua manual:Functions / Vararg / Closures
  • 学会用pcall/xpcall做异常捕获(进阶主题)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/12 6:12:15

汽车制造质量大数据分析如何助力企业创新发展?

在汽车制造业转型升级的关键阶段,质量大数据分析正成为企业提升核心竞争力的重要抓手。随着市场竞争日趋激烈,消费者对汽车产品的要求不断提高,传统的质量管理方法已经难以满足现代生产的需求。质量大数据分析通过整合多源异构数据&#xff0…

作者头像 李华
网站建设 2026/4/10 22:08:15

1核2GB服务器运行Nginx + MySQL + PHP(LNMP)会有性能瓶颈吗?

很多新手在搭建网站时, 会选最便宜的云服务器——比如1核2GB配置。 然后装上 Nginx MySQL PHP(即 LNMP 环境), 想着“先试试看”。 但很快发现: 网站偶尔打不开、后台卡顿、数据库连接超时…… 是配置太低&#xff…

作者头像 李华
网站建设 2026/4/13 21:18:33

对象存储OSS是什么,有什么用途?

你可能听过“云服务器”“数据库”“CDN”, 但有没有注意过“对象存储”这个词? 比如阿里云的 OSS(Object Storage Service),其他云厂商也有类似的产品,可能名字略有差异 听起来很技术,其实用途…

作者头像 李华
网站建设 2026/4/11 20:13:59

【毕业设计】机器学习基于python-CNN的常见鱼类分类识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华