gpt4 book ai didi

Lua 元表 : class fields vs instance fields

转载 作者:行者123 更新时间:2023-12-01 09:57:15 26 4
gpt4 key购买 nike

我正在使用 Corona/Lua 开发一款游戏,并实现了一个名为“Item”的类,它代表游戏中的武器、盔甲、护身符等。而且我是面向对象的 Lua 新手。

创建类的新实例后,我发现设置对象的某些属性似乎将它们设置在类元表中,而不是在对象本身中。

这是类和构造函数:

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

现在假设我基于这个原型(prototype)创建了两个对象:

local bow = Item:new()
bow.itemType = "bow"
starterBow.baseDamage = 5

local ring = Item:new()
ring.itemType = "ring"
ring.bonuses.damageBonus = 0.25

令我沮丧的是,“bonuses.damageBonus”属性似乎设置在元表中,因此适用于每个项目(即弓也获得伤害加成,并与戒指叠加)。然而,这种行为似乎仅限于“奖励”属性。如果我设置“itemType”属性,它会按预期附加到对象,而不是类。

我希望看到的行为是可以为单个项目设置“奖金”表的字段。知道我做错了什么吗?谢谢!

最佳答案

__index 元字段在您尝试从表中“获取”不存在的字段时触发。ring.bonuses.damageBonus = 0.25 正在尝试从 ring 中“获取”奖励,并且由于它不存在,因此转到元表并返回您的奖励表,然后将它的 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

关于Lua 元表 : class fields vs instance fields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23525121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com