news 2026/2/5 10:58:31

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/2/4 7:19:34

深度学习毕设项目推荐-基于python-CNN的常见鱼类分类识别

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

作者头像 李华
网站建设 2026/1/30 1:11:29

SQL常用语句大全

SQL 常用语句大全(通用版,适用于 MySQL、PostgreSQL、SQL Server、Oracle 等) SQL(Structured Query Language)分为几大类:DDL(数据定义)、DML(数据操作)、D…

作者头像 李华
网站建设 2026/1/30 20:34:20

微软发布 GitHub Copilot 的 C++ 代码编辑工具

微软正通过 Visual Studio 2026 Insiders 渠道提供 GitHub Copilot 的 C 代码编辑工具早期访问版本。据微软介绍,这些 C 工具能够让 GitHub Copilot 超越文件搜索功能,实现更强的上下文感知重构能力,支持跨多个文件和代码段的修改。公开版本已…

作者头像 李华
网站建设 2026/2/3 18:26:43

深度测评10个AI论文写作软件,继续教育学生轻松搞定论文!

深度测评10个AI论文写作软件,继续教育学生轻松搞定论文! AI 工具如何让论文写作更高效 在当前的学术环境中,继续教育学生面临着越来越高的论文写作要求。无论是本科、硕士还是博士阶段,撰写高质量的论文已成为一项不可或缺的任务。…

作者头像 李华
网站建设 2026/2/4 7:15:43

【windows】常见的系统环境变量,如%appdata%表示什么意思

Windows 常见系统环境变量详解 Windows 中的环境变量(Environment Variables)是用 %变量名% 包围的形式表示的路径或值,用于快速引用系统目录、配置等。它们分为用户变量(仅当前用户)和系统变量(所有用户&…

作者头像 李华