lua 中的对象创建

Object creation in lua

哪种方式更好?

这个

Dog = {}                                   

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

function Dog:makeSound()                  
  print('I say ' .. 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('I say ' .. self.sound)
end

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

第一个是每个人的做法,但第二个不那么令人困惑,对我来说更有意义

第二个有问题吗?

在第一个片段中,您的 class 的所有实例都有一个元table,而在第二个片段中,每个实例都有自己的元table。

如果一个人完成这项工作,为什么每个实例都有一个额外的 table? 还有一个问题是,如果不修改每个实例 metatable.

就无法更改 class 的行为

假设您想更改将 Dog 实例转换为字符串时发生的情况。

在第一个片段中,您只需实施 Dog.__tostring 即可。在第二个片段中,您必须先获取每个实例的元table。

最后就是个人喜好问题了

在您的两个代码段中,您都在创建一个全局实例。您需要将 newObj 设为本地!