方法/1
Dog = {}
function Dog:new()
local newObj = {sound = 'woof'}
return setmetatable(newObj, { __index = self })
end
方法/2
Dog = {}
function Dog:new()
local newObj = {sound = 'woof'}
self.__index = self
return setmetatable(newObj, self)
end
大多数时候我看到人们使用 self.__index = self
方法,这对我来说似乎很笨拙。为什么要将整个 Dog
对象以及所有不构成元表的附加方法传递给 setmetatable
? Method/1 非常适合将新对象的 metatable.__index
设置为 Dog
对象,而且也更干净。
有充分的理由使用Method/2而不是Method/1吗?
一些额外的代码来提供上下文,它适用于两种方法
function Dog:makeSound()
print('I say ' .. self.sound)
end
mrDog = Dog:new()
mrDog:makeSound()
最佳答案
虽然两种方法实现相同的最终行为,但有人可能更喜欢方法 2,因为它更符合“回收资源而不是创建”策略。方法 2 将始终使用一个表 Dog
作为元表,无论您创建多少个 Dog 对象。方法 1,OTOH,将创建一个新的匿名表,仅充当创建的每个 Dog 对象的元。
但是,对于该语言的新手来说,方法 1 可能更容易阅读和推理,因为它没有将元表和对象定义的关注点混合在一起。
关于oop - 在 Lua 中指定新对象的元表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20557941/