2 回答

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
我有一個(gè)朋友,他對(duì) Lua 元表的經(jīng)驗(yàn)比我看的要豐富得多。在這里發(fā)布答案以防它幫助其他人。
問題是我試圖將 UIElement 表用作“類”表和“對(duì)象”元表。在 __index 函數(shù)內(nèi)調(diào)用 rawget 時(shí),它試圖在 UIElement 表中查找內(nèi)容,而不是在 UIElement.new() 中創(chuàng)建的自身表中查找內(nèi)容。將這兩個(gè)拆分成不同的表(一個(gè)用于類,一個(gè)用于對(duì)象元表)固定的東西。
這是我更新的工作代碼:
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貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊
我必須承認(rèn)我不完全確定,你試圖通過在 LUA 而不是 C# 中編寫包裝類然后公開該類型來實(shí)現(xiàn)什么,但我注意到了這一點(diǎn):
對(duì)我來說,NativeClass .__new() 從來沒有在 MoonSharp 中成功過,就像你試圖在
self.__codeElement = BLU_UIElement.__new();
出于這個(gè)原因,我為我的本地類創(chuàng)建了自定義構(gòu)造函數(shù),并將它們作為委托傳遞給全局命名空間(盡管它的類型必須注冊(cè))。它看起來很像您通常會(huì)構(gòu)造一個(gè)對(duì)象。只是沒有 new 關(guān)鍵字:
在 C# 中
public NativeClass{
public static NativeClass construct()
{
return new NativeClass();
}
}
將靜態(tài)方法作為委托傳遞給腳本:
script["NativeClass"] = (Func<NativeClass>)NativeClass.construct;
然后你可以在 MoonSharp 中創(chuàng)建一個(gè)像這樣的新實(shí)例:
x = NativeClass()
編輯:所以沒有讀到你試圖用字符串來做到這一點(diǎn)。也許您應(yīng)該考慮不在 LUA 中編寫包裝類,而在 C# 中編寫,或者是否有禁止這樣做的原因?
- 2 回答
- 0 關(guān)注
- 151 瀏覽
添加回答
舉報(bào)