【问题标题】:Object creation in lualua中的对象创建
【发布时间】:2021-08-14 08:22:39
【问题描述】:

哪种方式更好?

这个

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()

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

第二个有什么问题吗?

【问题讨论】:

    标签: lua lua-table


    【解决方案1】:

    在第一个 sn-p 中,您的类的所有实例都有一个元表,而在第二个 sn-p 中,每个实例都有自己的元表。

    如果每个实例都完成这项工作,为什么还要为每个实例准备一个额外的表? 还有一个问题是,如果不修改每个实例元表,就无法更改类的行为。

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

    在第一个 sn-p 中,您只需实现 Dog.__tostring 即可。在第二个 sn-p 中,您必须先获取每个实例的元表。

    最后还是个人喜好问题。

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

    【讨论】:

      猜你喜欢
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      • 2014-06-18
      • 2013-02-10
      • 2021-10-22
      相关资源
      最近更新 更多