博客专栏

EEPW首页 > 博客 > 高效开发LuatOS:三大基础常识深度解析

高效开发LuatOS:三大基础常识深度解析

发布人:13673998452 时间:2025-06-25 来源:工程师 发布文章

提升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了。

虽然并不是所有的闭包都是上面这种代码的实现形式,但是初学者可以先记住这样的闭包形式。

如果不习惯闭包,初学者可以先避免在代码里面体现闭包的代码形式。

 

 

三、回调函数


 3.1 回调函数是什么

回调函数是在LuatOS编程过程中经常用到的一个技术。理解LuatOS的回调函数,可以从“事件驱动”和“函数作为参数”两个角度来把握:

回调函数(Callback)——是在特定事件发生时,由系统或框架自动调用你事先定义好的函数。你只需要把自己的函数注册给系统,等事件触发时,系统就会帮你调用它。

本质上,回调函数就是一个普通函数,但它被作为参数传递或注册到其他地方,由系统或其他代码在合适的时机自动执行。

回调函数的作用是实现事件响应,异步处理。

消息到来,定时器到点,网络收发等功能都经常会用到回调函数的处理。

总之,LuatOS的回调函数,就是你注册给系统的,在特定事件发生时自动被调用的函数。

回调函数让事件响应、异步处理、任务解耦变得简单灵活,是LuatOS事件驱动编程的核心机制之一。


 3.2 回调函数做消息订阅与发布

LuatOS支持通过sys.subscribe订阅消息并注册回调函数,消息发布时自动调用回调:

当sys.publish("TEST", 123) 被调用时,LuatOS内部会遍历订阅者列表,找到所有订阅了"TEST" 的回调函数,并自动把参数123传给这些回调函数。

通过这样的处理,事件触发和处理逻辑就被解耦,方便扩展和维护。

 

3.3 回调函数做定时器和异步操作

定时器到点后自动调用注册的回调函数:


3.4 任务和协程场景的回调函数使用

在多任务,也就是LuatOS的协程场景下,回调函数也常用于任务唤醒、事件响应等。

解耦调用者与被调用者:调用者只需知道“有回调”,不用关心回调具体做什么,提升灵活性。

你只需更换回调函数,就能实现不同的处理逻辑,无需修改底层框架代码。

任务和协程的详细信息,后续再讲解。


今天的内容就分享到这里了!


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。




相关推荐

技术专区

关闭