Class lua-捕获变量分配

Class lua-捕获变量分配,class,lua,oop,metaprogramming,Class,Lua,Oop,Metaprogramming,Ruby有一个非常有趣的功能,当你用“class.new”创建一个类并将它赋给一个常量(大写)时,语言“神奇地”设置了类的名称,使它与常量匹配 # This is ruby code MyRubyClass = Class.new(SuperClass) puts MyRubyClass.name # "MyRubyClass" ruby似乎“捕获”了分配,并在匿名类上插入设置名称 我想知道在Lua中是否有类似的方法 我已经实现了自己的类系统,但为了让它工作,我必须两次指定相同的名称: --

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中有什么方法可以做到这一点吗?

您可以取消对MyLuaClass的提及

> function class(name,superclass) _G[name] = {superclass=superclass} end
> class('MyLuaClass',33)
> =MyLuaClass
table: 0x10010b900
> =MyLuaClass.superclass
33
> 

您可以删除其中一个提到的
MyLuaClass

> function class(name,superclass) _G[name] = {superclass=superclass} end
> class('MyLuaClass',33)
> =MyLuaClass
table: 0x10010b900
> =MyLuaClass.superclass
33
> 

不是真的。Lua不是一种面向对象的语言。它有时会表现得像一个。但并非每次都如此。类在Lua中不是特殊值。一个表有你输入的值,没有更多。您所能做的最好的事情就是从class函数中手动设置key in _G,并且不必获取返回值


我想如果它真的让你很困扰,你可以使用debug.traceback(),获取堆栈跟踪,找到调用文件,然后解析它来找到变量名。那就定下来。但这不仅仅是有点过火。

不太可能。Lua不是一种面向对象的语言。它有时会表现得像一个。但并非每次都如此。类在Lua中不是特殊值。一个表有你输入的值,没有更多。您所能做的最好的事情就是从class函数中手动设置key in _G,并且不必获取返回值


我想如果它真的让你很困扰,你可以使用debug.traceback(),获取堆栈跟踪,找到调用文件,然后解析它来找到变量名。那就定下来。但这不仅仅是有点过分。

当分配给全局变量时,您可以为全局表设置一个
\uuuu newindex
元方法来捕获类变量的分配,并执行任何需要的操作。

当分配给全局变量时,您可以为全局表设置一个
\uu newindex
元方法来捕获类变量类变量的赋值,并执行任何需要的操作。

至少对于Lua 5.2:您可以捕获对A)Lua状态的全局表的赋值,如前一个回复中所述,以及B)对其u index和u newindex元方法已被替换(通过替换元表)的任何其他Lua对象的赋值,我可以确认这一点,因为我目前正在使用这两种技术将Lua脚本所做的分配挂接并重定向到外部C/C++资源管理。 不过,在读回这些值方面有一个难题,诀窍是不要让这些值被设置为Lua状态。
一旦它们存在,您的钩子将无法被调用,因此如果您想沿着这条路径前进,您需要捕获所有的get/set尝试,并且永远不要将值存储在Lua状态中。

至少对于Lua 5.2:您可以捕获对a)Lua状态的全局表的分配,如前面的答复中所述,还有B)对于其_index和_newindex元方法已被替换(通过替换元表)的任何其他Lua对象,我可以确认这一点,因为我目前正在使用这两种技术将Lua脚本所做的分配挂接并重定向到外部C/C++资源管理。 不过,在读回这些值方面有一个难题,诀窍是不要让这些值被设置为Lua状态。
一旦它们存在,您的钩子将无法调用,因此如果您想沿着这条路走下去,您需要捕获所有的get/set尝试,并且永远不要将值存储在Lua状态。

这是我最初的想法之一。另一种方法是在类(可能是一个表)上使用_索引方法,所以它是这样的:class.MyLuaClass(超类)。但我真的很想知道任务捕获,如果可能的话+感谢你的努力。这是我最初的想法之一。另一种方法是在类(可能是一个表)上使用_索引方法,所以它是这样的:class.MyLuaClass(超类)。但我真的很想知道任务捕获,如果可能的话+感谢你的努力。这看起来是可能的,但不是很有效;每次完成全局赋值时,我都必须调用lua函数;如果将全球分配保持在最低限度,可能不会有什么大不了的。我将尝试一下,谢谢你的提示。调用Lua函数的成本并没有那么高。如果您有性能问题,请转到C或使用LuaJIT。一些函数调用,特别是在这种设置工作中,是可以忽略的。这是最好的方法。谢谢这看起来是可能的,但效率不高;每次完成全局赋值时,我都必须调用lua函数;如果将全球分配保持在最低限度,可能不会有什么大不了的。我将尝试一下,谢谢你的提示。调用Lua函数的成本并没有那么高。如果您有性能问题,请转到C或使用LuaJIT。一些函数调用,特别是在这种设置工作中,是可以忽略的。这是最好的方法。谢谢我不想每次都让Lua表现得像一种面向对象的语言。如果我给你留下这样的印象,我很抱歉。我只是想知道如何捕捉任务。我会继续搜索。@egarcia:你不能捕获任务。Lua没有用于赋值的元表项。把作业放到桌子上,是的。一般来说,我不想让Lua每次都表现得像一种面向对象的语言。如果我给你留下这样的印象,我很抱歉。我只是想知道如何捕捉任务。我会继续搜索。@egarcia:你不能捕获任务。Lua没有用于赋值的元表项。把作业放到桌子上,是的。一般来说,没有。