我正在C应用程序(嵌入式环境/MCU)中使用LuaV5.2.2。
我需要在Lua中公开一些“参数”,在读写时需要直接访问硬件(因此需要C调用)不过,我正在寻找其他方法来实现这一点,而不是使用普通的旧getter和setter。
我主要是探索Lua的元编程能力,但我也相信我可以为用户创建一个更简单的界面。
我想要达到的是如下行为:

my_param = createParameter{name="hw_param1", type="number", min=0, max=100}

my_param = 5

result = my_param + 3

在第一行创建一个新参数。这是对C函数的调用。用户数据被推送到具有正确初始化结构的堆栈中硬件也会根据需要初始化。返回一个新表。
在第二行,对参数对象进行赋值。我想用一个参数(赋值的参数)调用一个C函数,这样就可以将值存储到硬件寄存器中。
在第三行读取参数。我再次需要调用一个C函数,它将从硬件寄存器中获取参数值,并返回结果。
请注意,此参数的实际值可能在Lua的范围之外更改,因此在初始化期间读取一次该值是不正确的每次都必须调用C函数才能获得实际值类似地,对值的写入必须立即导致对硬件的写入。
我怎样才能做到这一点具体来说,我可以改变参数的元表来实现第2行和第3行吗?(我知道如何实施第1行)。
还有必要从构造函数返回表吗例如,我可以返回一个基本的Lua类型(例如一个数字)吗?

最佳答案

是的,您可以修改元表元方法。
第2行将完全更改变量的值。
但是,如果要在参数对象中设置一个字段,如:my_param.x = n,则会调用__newindex元方法;您可以覆盖该元方法,使其按您希望的方式工作在您的例子中,您可以让它设置参数的字段,并用C函数调用更新它。
关于第3行,同样的原则也适用,这次您只需使用__add元方法,并在调用__add时操作对象。
http://lua-users.org/wiki/MetamethodsTutorial

10-08 08:08
查看更多