2026/4/18 16:12:15
网站建设
项目流程
如何一个空间放两个网站,高端网页制作公司,android手机开发,网页设计课程总结500字Lua 函数
1. 课程信息
课题#xff1a;Lua 函数基础与进阶用法课时建议#xff1a;60 ~ 90 分钟适合对象#xff1a;已掌握 Lua 变量、流程控制#xff08;if/for/while#xff09;与 table 基础的学习者
2. 教学目标
理解函数的作用#xff1a;封装逻辑、复用代码、提升…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)returnabendprint(add(2,3))-- 5更推荐的局部函数localfunctionadd(a,b)returnabendprint(add(2,3))3.2 函数的本质变量里装的值下面两段代码等价localfunctionadd(a,b)returnabendlocaladd addfunction(a,b)returnabend强调函数就是一种值和数字、字符串一样因此可以赋值/传递。3.3 参数与返回值3.3.1 多参数、多返回值localfunctiondivmod(a,b)returnmath.floor(a/b),a%bendlocalq,rdivmod(17,5)print(q,r)-- 3 23.3.2 只接收部分返回值localfunctiondivmod(a,b)returnmath.floor(a/b),a%bendlocalqdivmod(17,5)print(q)-- 3 (only first return value)3.3.3 返回值数量不固定的常见场景string.find找到了返回位置没找到返回nil自己写函数时也可以失败返回nil 错误信息localfunctiontoNumber(s)localntonumber(s)ifnnilthenreturnnil,not a numberendreturnnendlocaln,errtoNumber(12x)print(n,err)-- nil not a number3.4 可变参数Varargs...localfunctionsum(...)localtotal0fori1,select(#,...)dolocalvselect(i,...)totaltotalvendreturntotalendprint(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))-- -13.5.2 返回函数工厂函数localfunctionmakeAdder(step)returnfunction(x)returnxstependendlocaladd10makeAdder(10)print(add10(7))-- 173.6 闭包Closure与作用域闭包函数“记住”它被创建时所在的外部变量。localfunctionmakeCounter()localcount0returnfunction()countcount1returncountendendlocalc1makeCounter()print(c1())-- 1print(c1())-- 2localc2makeCounter()print(c2())-- 1 (independent)要点count是局部变量但因为被内部函数引用所以不会立刻释放适合实现计数器、缓存、封装私有状态3.7:与.的差异面向对象常见localPlayer{}Player.__indexPlayerfunctionPlayer.new(name)returnsetmetatable({namename},Player)endfunctionPlayer.say(self,msg)-- dot style requires explicit selfprint(self.name..: ..msg)endfunctionPlayer:say2(msg)-- colon style passes self implicitlyprint(self.name..: ..msg)endlocalpPlayer.new(Alice)p.say(p,hello)p:say2(hello)规则obj:method(x)等价于obj.method(obj, x)定义时用function T:method(...)调用时也用:保持一致4. 课堂演示建议流程Step 15min用“重复代码”的例子引出函数封装Step 210min讲local function与返回值Step 315min多返回值、nil err的错误返回模式Step 415min可变参数...与selectStep 515min高阶函数与闭包重点Step 610min:与.的差异结合 table metatable 简单展示5. 练习题课堂练习 1写一个安全除法实现safeDiv(a, b)当b 0时返回nil, division by zero否则返回a / b练习 2实现map实现map(arr, fn)arr是数组 tablefn是函数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 .. : .. msgprefix由闭包保存7. 常见坑总结多返回值丢失把函数返回值放在表达式中如拼接、作为参数时常只保留第一个返回值全局污染缺少local容易污染全局命名空间:与.混用定义用:却用.调用或反过来会导致self不正确对nil判断不严谨失败返回时要同时返回nil, err调用方要判断if not ok then ... end8. 扩展阅读建议Lua manualFunctions / Vararg / Closures学会用pcall/xpcall做异常捕获进阶主题