oop - 在 Lua 中指定新对象的元表

标签 oop lua lua-table metatable

方法/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 对象以及所有不构成元表的附加方法传递给 setmetatableMethod/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/

相关文章:

c++ - 类继承 : static members and virtual methods

c# - 依赖注入(inject)导致工厂激增?

C++调用带可变参数的lua函数

Lua 错误 : string expected, 为零 --- 错误的参数 #2

list - 迭代列表的特定条目

class - Lua,哪种方式来做类表和实例化?

java - 多类型自定义数组列表

asp.net - 如何在我的代码中使用接口(interface)使其更具可扩展性?

function - 通过引用调用Lua函数

list - 在 Lua 列表中搜索项目