Lua元表中的类字段与实例字段如何区分?
- 内容介绍
- 文章标签
- 相关推荐
本文共计506个文字,预计阅读时间需要3分钟。
我在使用Corona+Lua开发一款游戏,并实现了一个名为Item的类,它代表游戏中的武器、盾牌、护身符等。我是一位Lua编程新手。在创建类的新实例后,我发现设置对象的某些属性似乎会将它们重置。
在创建类的新实例之后,我发现设置对象的某些属性似乎将它们设置在类metatable中,而不是在对象本身中.
这是类和构造函数:
local Item = { name = nil, itemType = nil, scarcity = "basic", baseDamage = 0, -- Bow only bonuses = { damageBonus = 0, speedBonus = 0, critBonus = 0, dropBonus = 0, rechargeBonus = 0, xpBonus = 0 } } -- Creates a simple blank instance of the Item class. function Item:new(o) local item = o or {} setmetatable(item, self) self.__index = self return item end
现在假设我基于这个原型创建了两个对象:
local bow = Item:new() bow.itemType = "bow" starterBow.baseDamage = 5 local ring = Item:new() ring.itemType = "ring" ring.bonuses.damageBonus = 0.25
令我沮丧的是,“bonuses.damageBonus”属性似乎已经设置在metatable中,因此适用于每个项目(即弓也获得伤害加值,并与环堆叠).然而,这种行为似乎仅限于“奖金”属性.如果我设置“itemType”属性,它将按预期附加到对象而不是类.
我想看到的行为是,可以为单个项目设置“奖金”表的字段.知道我做错了什么吗?谢谢!
当您尝试从表中“获取”不存在的字段时,会触发__index元字段.ring.bonuses.damageBonus = 0.25试图从环中“获取”奖金,因为它不存在,转到metatable并返回你的奖金表,然后将其damageBonus索引设置为0.25.
理解只是在Item表中声明变量并不意味着您的Item实例会将它们作为实例变量继承.为此,您需要在Item:new()函数中声明/初始化它们:
function Item:new(o) local item = o or {} setmetatable(item, self) self.__index = self item.bonuses={} -- create instance bonuses table and give default values for k,v in pairs(self.bonuses) do item.bonuses[k]=v end return item end
本文共计506个文字,预计阅读时间需要3分钟。
我在使用Corona+Lua开发一款游戏,并实现了一个名为Item的类,它代表游戏中的武器、盾牌、护身符等。我是一位Lua编程新手。在创建类的新实例后,我发现设置对象的某些属性似乎会将它们重置。
在创建类的新实例之后,我发现设置对象的某些属性似乎将它们设置在类metatable中,而不是在对象本身中.
这是类和构造函数:
local Item = { name = nil, itemType = nil, scarcity = "basic", baseDamage = 0, -- Bow only bonuses = { damageBonus = 0, speedBonus = 0, critBonus = 0, dropBonus = 0, rechargeBonus = 0, xpBonus = 0 } } -- Creates a simple blank instance of the Item class. function Item:new(o) local item = o or {} setmetatable(item, self) self.__index = self return item end
现在假设我基于这个原型创建了两个对象:
local bow = Item:new() bow.itemType = "bow" starterBow.baseDamage = 5 local ring = Item:new() ring.itemType = "ring" ring.bonuses.damageBonus = 0.25
令我沮丧的是,“bonuses.damageBonus”属性似乎已经设置在metatable中,因此适用于每个项目(即弓也获得伤害加值,并与环堆叠).然而,这种行为似乎仅限于“奖金”属性.如果我设置“itemType”属性,它将按预期附加到对象而不是类.
我想看到的行为是,可以为单个项目设置“奖金”表的字段.知道我做错了什么吗?谢谢!
当您尝试从表中“获取”不存在的字段时,会触发__index元字段.ring.bonuses.damageBonus = 0.25试图从环中“获取”奖金,因为它不存在,转到metatable并返回你的奖金表,然后将其damageBonus索引设置为0.25.
理解只是在Item表中声明变量并不意味着您的Item实例会将它们作为实例变量继承.为此,您需要在Item:new()函数中声明/初始化它们:
function Item:new(o) local item = o or {} setmetatable(item, self) self.__index = self item.bonuses={} -- create instance bonuses table and give default values for k,v in pairs(self.bonuses) do item.bonuses[k]=v end return item end

