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做异常捕获(进阶主题)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1119373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

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

计算机深度学习毕设实战-基于python的海洋生物识别

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

这里还有8个“Manus”:1亿美元ARR,都是ToC

Meta刚掏出20亿美元把Manus收入囊中的同时,一份名单也随即在VC圈疯传—— “1亿美元ARR俱乐部”。 上榜公司不多,但个个鼎鼎大名: Perplexity:200亿美元ElevenLabs:66亿美元Lovable:66亿美元Replit&…

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

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

拒绝繁琐配置,推荐一款简洁易用的知识管理工具sward

中国区Confluence Server即将停止销售,今天给大家推荐一款国产开源免费的开源平替方案 - sward。 1、产品简介 sward是一款国产的且免费开源的知识管理工具,包含知识库管理、目录管理、文档管理、markdown管理、文档的评审与版本维护等模块。产品页面简…

【问题记录】解决unity 项目里用了AVPro Video,打包到Mac端时报错Plugin ‘AVProVideo.bundle‘ is used from several locations

unity 项目里用了AVPro Video&#xff0c;打包到Mac端时报错如下&#xff1a;Plugin AVProVideo.bundle is used from several locations: Assets/Plugins/AVProVideo.bundle would be copied to <PluginPath>/AVProVideo.bundle Assets/Plugins/macOS/AVProVideo.bundle…

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

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

2027 年 1 月 1 日起施行!GB46864 新规落地,二手电子产品信息清除有了 “铁规矩”,你的隐私不再 “裸奔”

随着电子产品更新迭代加速&#xff0c;二手手机、电脑、平板等设备的流通越来越频繁。但你是否知道&#xff0c;简单的 “恢复出厂设置” 根本无法彻底清除数据&#xff1f;不少不法分子通过技术手段恢复二手设备中的用户信息&#xff0c;导致通讯录泄露、账号被盗、生物识别信…

融资35亿后,Kimi神秘模型现身竞技场

融资35亿后&#xff0c;Kimi的新模型紧跟着就要来了&#xff1f;&#xff01; 大模型竞技场上&#xff0c;一个名叫Kiwi-do的神秘模型悄然出现。 发现这个新模型的推特网友询问了模型的身份&#xff0c;结果模型自报家门&#xff0c;表示自己来自月之暗面Kimi&#xff0c;训练…

vscode出现中文乱码?

第一次用vscode打开代码会出现中文注释因识别不了而乱码的情况&#xff0c;类似这样printf(“张三\n”);1.单击软件左下角设置&#xff08;类似齿轮&#xff09;的按钮在出现的搜索框里输入&#xff1a;Files.autoGuessEncoding&#xff0c;按回车键确定。关闭vscode,然后重新打…

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

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

彻底搞懂 Event Loop!一次性吃透宏任务、微任务、执行顺序

Event Loop&#xff08;事件循环&#xff09;是 JavaScript 执行机制里的核心知识点。不管是前端面试还是日常开发&#xff0c;只要涉及异步操作&#xff0c;就绕不开它。 这篇文章不玩高深术语&#xff0c;用一套真实示例&#xff0c;带你搞懂&#xff1a; 同步任务、宏任务、…

AI跨文化陪练系统:用技术破解“语言通而心意阻”

和海外客户谈判时&#xff0c;一句“再考虑”被误解为拒绝&#xff1b;向异国朋友问候&#xff0c;却因语气不当显得冒犯——这种“语言过关、文化翻车”的场景&#xff0c;正是AI跨文化能力陪练系统要解决的核心问题。它不止是翻译工具&#xff0c;更是靠技术复刻真实跨文化场…

AI正在占领你的视频推荐流

你的视频推荐流&#xff0c;正在被AI“吞噬”。 这不是危言耸听&#xff0c;正经新调查发现&#xff1a; YouTube算法向新用户展示的视频中&#xff0c;有超过20%的内容是AI制造的低质量视频。 再扎心点说就是&#xff0c;我们平时在YouTube刷到的每5条视频中&#xff0c;可…

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

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

docker 部署 Prompt Optimizer (提示词优化器)

Prompt Optimizer (提示词优化器) &#x1f680; 在线体验 | 快速开始 | 常见问题 | 开发文档 | Vercel部署指南 | Chrome插件 &#x1f4d6; 项目简介 Prompt Optimizer是一个强大的AI提示词优化工具&#xff0c;帮助你编写更好的AI提示词&#xff0c;提升AI输出质量。支持…

2026 年观察名单:基于 a16z「重大构想」,详解稳定币、RWA 及 AI Agent 等 8 大流行趋势

撰文&#xff1a;Stacy Muur编译&#xff1a;Glendon&#xff0c;Techub News基于 a16z 的「重大构想」&#xff0c;本文分析了 2026 年 8 个主要流行趋势的获胜方向和观察名单。支付、稳定币和金融轨道的重塑论点&#xff1a;稳定币将成为互联网的结算层&#xff0c;而不仅仅是…

深度学习毕设选题推荐:基于人工智能卷积神经网络的海洋生物识别

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

导师推荐2026最新AI论文平台TOP10:本科生毕业论文必备测评

导师推荐2026最新AI论文平台TOP10&#xff1a;本科生毕业论文必备测评 2026年AI论文平台测评&#xff1a;为何需要这份榜单&#xff1f; 随着人工智能技术在学术领域的深入应用&#xff0c;越来越多的本科生开始依赖AI写作工具辅助论文撰写。然而&#xff0c;面对市场上五花八门…

一文带你快速了解大模型量化

一、什么是大模型量化&#xff1f; 简单来说&#xff0c;量化的核心是“精度转换”&#xff1a;把大模型中原本用高精度格式存储和计算的数据&#xff08;比如FP32、FP16&#xff0c;也就是32位、16位浮点数&#xff09;&#xff0c;转换为低精度格式&#xff08;比如INT8、INT…