在LuatOS开发中避免踩坑?务必牢记这三个关键常识。它们源自实战经验总结,涵盖兼容性、效率陷阱等痛点,为你的项目开发筑起防护墙,加速迭代进程。
本期一起来了解LuatOS开发需要熟悉的几个常识。
在Lua代码里面,经常看到没有名字的函数。
这种函数定义之后,要么马上运行,要么作为另一个函数的返回值赋给其他变量,所以并不需要一个函数名字——称为匿名函数。
匿名函数基础语法结构:
匿名函数可以某些时候简化代码,初学者写代码可以先不考虑匿名函数。但是由于匿名函数在你能阅读到的Lua代码里面出现的频次实在是太高了,所以你也不得不重视和习惯匿名函数。
闭包的实现通常是通过在外部函数内部定义一个函数,并将这个内部函数作为外部函数的返回值。
这样一来,内部函数就可以访问外部函数作用域中的变量,即使外部函数已经执行完毕,这些变量依然可以被内部函数访问——从而形成闭包。
常见的闭包实现模式如下:
这样的好处是,可以定义一个函数,能够在一定范围内,访问外部的变量,实现可控的持续行为。
很多初学者会被这段代码迷惑,会被绕晕。
这里做一下解释:
z函数里面声明的变量,z是函数的参数;
在代码里面因为f=outer(10),所以f(5)就意味着是调用了两次函数,传入了两个函数的参数:outer(10)(5);
第一次调用,out(10) ,意味着在outer函数里面,y = x这句,x换成10,就是:y = 10;
outer(10)(5)意味着5是内部匿名函数的参数,就是替代z的;
匿名函数返回y+z,这里y是10,z是5,返回的就是10+5=15。
这里比较绕的,就是给了两次参数,一个是10对应x,一个是5对应z。
匿名函数和闭包,对初学者确实有点绕。很多读者不明白:为什么z是outer的第二个参数?
这里需要特别搞清楚的是,outer这个函数的返回值是个函数,而且这个函数是有参数的。
那么,这个带参数的函数赋值给f之后,f就是个函数了。于是给f一个参数5,这个5自然就是返回的函数的参数了,也就是z了。
虽然并不是所有的闭包都是上面这种代码的实现形式,但是初学者可以先记住这样的闭包形式。
如果不习惯闭包,初学者可以先避免在代码里面体现闭包的代码形式。
回调函数是在LuatOS编程过程中经常用到的一个技术。理解LuatOS的回调函数,可以从“事件驱动”和“函数作为参数”两个角度来把握:
回调函数(Callback)——是在特定事件发生时,由系统或框架自动调用你事先定义好的函数。你只需要把自己的函数注册给系统,等事件触发时,系统就会帮你调用它。
本质上,回调函数就是一个普通函数,但它被作为参数传递或注册到其他地方,由系统或其他代码在合适的时机自动执行。
回调函数的作用是实现事件响应,异步处理。
消息到来,定时器到点,网络收发等功能都经常会用到回调函数的处理。
总之,LuatOS的回调函数,就是你注册给系统的,在特定事件发生时自动被调用的函数。
回调函数让事件响应、异步处理、任务解耦变得简单灵活,是LuatOS事件驱动编程的核心机制之一。
LuatOS支持通过sys.subscribe订阅消息并注册回调函数,消息发布时自动调用回调:
当sys.publish("TEST", 123) 被调用时,LuatOS内部会遍历订阅者列表,找到所有订阅了"TEST" 的回调函数,并自动把参数123传给这些回调函数。
通过这样的处理,事件触发和处理逻辑就被解耦,方便扩展和维护。
定时器到点后自动调用注册的回调函数:
在多任务,也就是LuatOS的协程场景下,回调函数也常用于任务唤醒、事件响应等。
解耦调用者与被调用者:调用者只需知道“有回调”,不用关心回调具体做什么,提升灵活性。
你只需更换回调函数,就能实现不同的处理逻辑,无需修改底层框架代码。
任务和协程的详细信息,后续再讲解。
今天的内容就分享到这里了!
用户1750667546105 2025-6-23 17:52
用户1750667546105 2025-6-23 17:52
用户1750667546105 2025-6-23 17:51
用户1750667546105 2025-6-23 17:51
用户1750667546105 2025-6-23 17:50
用户1750667546105 2025-6-23 17:50
用户1750667546105 2025-6-23 17:50
用户1750667546105 2025-6-23 17:50
用户1750667546105 2025-6-23 17:49
用户1750667546105 2025-6-23 17:49