gpt4 book ai didi

lua - 试图理解这个 lua 片段

转载 作者:行者123 更新时间:2023-12-04 17:55:02 30 4
gpt4 key购买 nike

我试图了解这个函数的作用。任何人都可以向我解释这一点吗?

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

它是这样调用的:
self = newInstance (self)

最佳答案

这个函数显然用于在 Lua 中提供 OOP 的一个变体(在我看来有点草率)。

这是一个类(class)的工厂。

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

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(),但是不同的 self:
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(“类”)是一个 __index (A)元表的( o1以上)和 o2 , 设置在 (B) .但是 o1o2实际上是两个不同的表,创建于 (B) (“类实例”或“对象”)。

注意:我们设置了 C.__index等于 C自己在 (A)所以我们会重复使用一张 table 。以下效果相同:
prototype = { }

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

C = { __index = prototype }

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

o = newInstance(C)

关于lua - 试图理解这个 lua 片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9616606/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com