Lua中的对象创建

哪种方式更好呢?

这个

Dog = {}

function Dog:new()
  newObj = {sound = 'woof'}
  self.__index =  self
  return setmetatable(newObj, self)
end

function Dog:makeSound()
  print('我发出 ' .. self.sound .. ' 的声音')
end

mrDog = Dog:new()
mrDog:makeSound()

还是这个

Dog = {}

function Dog:new()
  newObj = {sound = 'woof'}
  return setmetatable(newObj, {__index = self})
end

function Dog:makeSound()
  print('我发出 ' .. self.sound .. ' 的声音')
end

mrDog = Dog:new()
mrDog:makeSound()

第一个是每个人都会用的方式,但是第二个方式更容易理解,更有意义

第二种方式有什么问题吗?

点赞
用户2858170
用户2858170

在第一个代码段中,你有一个用于所有类实例的单个元表,而在第二个代码段中,每个实例都有自己的元表。

如果一个表能胜任全部工作,为什么要为每个实例都加上一个额外的表呢? 而且你还面临一个问题,那就是如果要改变类的行为,必须修改每个实例的元表。

比方说,你想改变将 Dog 实例转换为字符串时发生的事情。

在第一个代码段中,你只需实现 Dog.__tostring 就可以了,而在第二个代码段中,你必须先获取每个实例的元表。

最后,这是一个个人喜好的问题。

在你的两个代码段中,你都创建了一个全局实例。你需要将 newObj 改为局部变量!

2021-05-26 06:11:10