这是我第一次尝试在Lua中应用OOP。该类是游戏中已存在的“Frame”类的派生
LibListView = {}
function LibListView:New(self)
local listviewmt = {
buttons = {},
data = {},
initiated = true,
OldSetScript = SetScript,
SetScript = nil,
-- more parameters and methods
SetScript = function(self,handler,fnctn)
local scripts = "OnHide,OnLoad,OnMouseWheel,OnSizeChanged,OnShow,OnUpdate"
if string.find(scripts,handler) then
self:HookScript(handler,fnctn)
else
self.OldSetScript(handler,fnctn)
end
end,
}
setmetatable(self, { __index = setmetatable(listviewmt, getmetatable(self)) })
-- not simply setmetatable(main, class) to avoid already present meta overwritting
end
如果我写
listview = LibListView:New(self)
代码运行良好。此时,我想确保创建该类时无需传递
self
作为参数:简而言之,使用措辞
listview = LibListView:New()
让代码更加优雅。
一些建议?
这定义了 self 两次
function LibListView:New(self)
当您使用 :
而不是 .
定义方法时,它的第一个参数是 self
。您在这里所做的就是第二个参数也称为 self
。
你有2个选择, 不要将 self 放入签名中,只需将其不带任何参数即可:
function LibListView:New()
或者
不要使用
:
并将第一个参数定义为 self: function LibListView.New(self)
,您仍然可以使用 :
糖语法来调用它。
这里有一个资源,可以让您了解更多关于
:
如何在 lua 中工作的信息:Lua 编程:第 16 章 – 面向对象编程
这是本章中特别相关的引用:
self 参数的使用是任何面向对象语言的中心点。大多数面向对象语言都对程序员部分隐藏了这种机制,因此她不必声明此参数(尽管她仍然可以在方法中使用名称 self 或 this )。 Lua 还可以使用冒号运算符隐藏此参数。我们可以将之前的方法定义重写为
function Account:withdraw (v) self.balance = self.balance - v end