在 Lua 中接近 OOP

问题描述 投票:0回答:1

这是我第一次尝试在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()

让代码更加优雅。

一些建议?

class object oop lua metatable
1个回答
1
投票

这定义了 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
© www.soinside.com 2019 - 2024. All rights reserved.