lua - 捕获变量赋值

时间:2010-07-05 19:27:10

标签: class lua oop metaprogramming

Ruby有这个非常有趣的功能,当你用'Class.new'创建一个类并将它分配给一个常量(大写)时,语言“神奇地”设置类的名称,使它与常量匹配。

# This is ruby code
MyRubyClass = Class.new(SuperClass)
puts MyRubyClass.name # "MyRubyClass"

似乎ruby“捕获”了赋值,插入会在匿名类中设置名称。

我想知道在Lua中是否有办法做类似的事情。

我已经实现了自己的类系统,但为了工作,我必须指定两次相同的名称:

-- This is Lua code
MyLuaClass = class('MyLuaClass', SuperClass)
print(MyLuaClass.name) -- MyLuaClass

我想摆脱那个'MyLuaClass'字符串。在Lua有没有办法做到这一点?

4 个答案:

答案 0 :(得分:4)

分配给全局变量时,您可以为全局变量表设置__newindex元方法,以捕获类变量的赋值并执行所需的操作。

答案 1 :(得分:2)

您可以删除MyLuaClass ...

中的一个提及
> function class(name,superclass) _G[name] = {superclass=superclass} end
> class('MyLuaClass',33)
> =MyLuaClass
table: 0x10010b900
> =MyLuaClass.superclass
33
> 

答案 2 :(得分:0)

不是真的。 Lua不是面向对象的语言。它有时可能表现得像。但远非每一次。类在Lua中不是特殊值。一个表具有您放入其中的值,不再有。您可以做的最好的事情是从类函数手动设置_G中的键,并消除必须获取返回值。

我想,如果它真的,真的困扰你,你可以使用debug.traceback(),获取堆栈跟踪,找到调用文件,并解析它以找到变量名称。然后设置。但这有点过分了。

答案 3 :(得分:0)

至少尊重Lua 5.2:你可以捕获A)Lua State的全局表,如前一个回复中提到的,以及B)任何其他Lua对象的分配__index和__newindex元方法已被替换(通过替换metatable),我可以确认,因为我目前正在使用这两种技术来挂钩和重定向由Lua脚本进行的外部C / C ++资源管理。 虽然有一些关于阅读它们的问题,但诀窍是不要让值设置在Lua状态。 一旦它们存在,你的钩子将无法被调用,所以如果你想沿着这条路走下去,你需要捕获所有的get / set尝试,并且永远不要将这些值存储在一个Lua状态。