加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

试图理解这个lua片段

发布时间:2020-12-14 21:48:12 所属栏目:大数据 来源:网络整理
导读:我试图了解这个功能的作用.任何人都可以向我解释这个吗? function newInstance (class) local o = {} setmetatable (o,class) class.__index = class return oend 它被称为这样: self = newInstance (self) 解决方法 这个函数显然可以在Lua中提供一个OOP变
我试图了解这个功能的作用.任何人都可以向我解释这个吗?

function newInstance (class)
    local o = {}
    setmetatable (o,class)
    class.__index = class
    return o
end

它被称为这样:

self = newInstance (self)

解决方法

这个函数显然可以在Lua中提供一个OOP变体(在我看来有点草率).

这是一个班级的工厂.

为清楚起见,可以重写如下:

C = { }

C.foo = function(self) -- just some method,so class would not be empty
  print("foo method called",tostring(self))
end

C.__index = C -- (A)

function newInstance(class)
  return setmetatable({ },class) -- (B)
end

现在,如果我们创建两个新的C实例,我们清楚地看到它们都有一个方法foo(),但不同的自我:

o1 = newInstance(C)
o1:foo() --> foo method called  table: 0x7fb3ea408ce0

o2 = newInstance(C)
o2:foo() --> foo method called  table: 0x7fb3ea4072f0

foo方法是相同的:

print(o1.foo,o2.foo,o1.foo == o2.foo and "equal" or "different")
--> function: 0x7fb3ea410760    function: 0x7fb3ea410760    equal

这是因为表C(“类”)是o1和o2的元表的__index(上面的(A)),在(B)中设置.但是o1和o2实际上是两个不同的表,在(B)创建(“类实例”或“对象”).

注意:我们在(A)处将C .__ index设置为等于C本身,因此我们将重用一个表.以下具有相同的效果:

prototype = { }

prototype.foo = function(self) -- just some method,tostring(self))
end

C = { __index = prototype }

function newInstance(class)
  return setmetatable({ },class)
end

o = newInstance(C)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读