obj = {}
function obj:setName(name)
print("obj: ", self)
print("name: ", obj)
end
我創建一個對象並指定一個類似上面的方法。現在我這樣稱呼它:lua:檢查方法的主體
obj:setName("blabla")
自身標識符指的是obj。我的問題是,該功能也可能被通過
obj.setName("blabla")
訪問。在這種情況下,OBJ不會被作爲參數,「布拉布拉」將採取自我參數的地方,而不是服務的名稱傳遞。這是因爲:經營者在函數聲明僅僅是一個速記/糖語法
function obj.setName(self, name)
我可以採用某種適當的檢查,如果真的自我是主體/如果該功能已經被結腸運行?它不能被argCount告知,也不能直接在函數中寫obj,因爲它會被實例化,並且函數被引用到我定義的範圍之外。我唯一的想法是檢查自己是否擁有一個成員「setName」
function obj:setName(name)
if ((type(self) ~= "table") or (self.setName == nil)) then
print("no subject passed")
return
end
print("obj: ", self)
print("name: ", obj)
end
但這也不乾淨。
編輯:現在這個樣子做它:
local function checkMethodCaller()
local caller = debug.getinfo(2)
local selfVar, self = debug.getlocal(2, 1)
assert(self[caller.name] == caller.func, [[try to call function ]]..caller.name..[[ with invalid subject, check for correct operator (use : instead of .)]])
end
function obj:setName(name)
checkMethodCaller()
print(self, name)
end
你可以把它寫在一行中:'assert(self.setName)'在錯誤的調用中停止執行你的腳本。 –
有一個想法,比較self.setName obj.setName(函數)。如果這匹配,那必須是被調用的函數。 – user2399203
你真的*確定你想要這樣做嗎?從長遠來看,這種魔法可能會令人困惑並容易出錯。也許你可以改變':'-using對象的定義來使用'.'方法,或者你可以添加一個標誌來告訴你的處理函數是否應該使用':'或'.'方法? – hugomg