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
设为本地!
哪种方式更好?
这个
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
设为本地!