2 回答
TA贡献1804条经验 获得超2个赞
我有一个朋友,他对 Lua 元表的经验比我看的要丰富得多。在这里发布答案以防它帮助其他人。
问题是我试图将 UIElement 表用作“类”表和“对象”元表。在 __index 函数内调用 rawget 时,它试图在 UIElement 表中查找内容,而不是在 UIElement.new() 中创建的自身表中查找内容。将这两个拆分成不同的表(一个用于类,一个用于对象元表)固定的东西。
这是我更新的工作代码:
UIElement = {};
setmetatable( UIElement, {
__call = function( cls, ... )
return cls.new( ... );
end,
} );
UIElement.objectMetaTable = {
__index = function( self, key )
local objectValue = rawget(self, key);
if objectValue ~= nil then
return objectValue;
end
local classValue = UIElement[key];
if classValue ~= nil then
return classValue;
end
local codeElement = rawget(self, "__codeElement");
if codeElement then
return codeElement[key];
end
end,
};
function UIElement.new()
local newInstance = setmetatable( { id = "blah" }, UIElement.objectMetaTable );
newInstance.__codeElement = BLU_UIElement.__new();
return newInstance;
end
TA贡献1951条经验 获得超3个赞
我必须承认我不完全确定,你试图通过在 LUA 而不是 C# 中编写包装类然后公开该类型来实现什么,但我注意到了这一点:
对我来说,NativeClass .__new() 从来没有在 MoonSharp 中成功过,就像你试图在
self.__codeElement = BLU_UIElement.__new();
出于这个原因,我为我的本地类创建了自定义构造函数,并将它们作为委托传递给全局命名空间(尽管它的类型必须注册)。它看起来很像您通常会构造一个对象。只是没有 new 关键字:
在 C# 中
public NativeClass{
public static NativeClass construct()
{
return new NativeClass();
}
}
将静态方法作为委托传递给脚本:
script["NativeClass"] = (Func<NativeClass>)NativeClass.construct;
然后你可以在 MoonSharp 中创建一个像这样的新实例:
x = NativeClass()
编辑:所以没有读到你试图用字符串来做到这一点。也许您应该考虑不在 LUA 中编写包装类,而在 C# 中编写,或者是否有禁止这样做的原因?
- 2 回答
- 0 关注
- 105 浏览
添加回答
举报