调用push方法添加元素后Array仍为空的问题排查(附Player类代码)
问题分析与修复方案
嘿,我一眼就瞅出你代码里的问题了——调用buy方法往@inventory里添加元素后数组还是空的,核心原因出在你的inventory方法和初始化逻辑上,咱们一步步拆解:
为什么数组一直为空?
你写的inventory方法每次被调用时,都会强制把@inventory重置成空数组:
def inventory @inventory = [] end
而你在initialize里还特意调用了这个方法:@inventory = inventory。这就导致:
- 初始化时确实能得到空数组,但这个方法的逻辑完全错了——它的作用应该是返回当前的背包内容,而不是每次调用都清空背包。
- 要是后续不小心调用了
inventory方法(比如误写inventory代替@inventory),之前用buy添加的所有物品都会直接消失,背包回到空状态。
另外,你的buy方法里还有个小疏漏:puts "你剩余#{gold}金币。"这里的gold没加@,Ruby会尝试调用未定义的gold方法,应该改成@gold。
修复后的完整代码
class Player def initialize(hp, attack, defence, gold) @hp = hp @attack = attack @defence = defence @gold = gold # 直接初始化背包为空数组,不用绕弯调用inventory方法 @inventory = [] end # 把inventory改成读取背包的getter方法,返回现有内容而非重置 def inventory @inventory end def buy(item) if @gold >= item.price @gold -= item.price puts "你支付了#{item.price}金币,获得了#{item.name}。" # 修复金币显示的变量问题 puts "你剩余#{@gold}金币。" @inventory.push([item.name, item.price, item.attack, item.defence]) puts "背包物品:#{@inventory}" end end end
额外的优化小建议
- 与其把item拆成数组存入背包,不如直接存item对象,后续操作会更灵活:
@inventory.push(item) # 输出时可以这样格式化展示 puts "背包物品:#{@inventory.map { |item| [item.name, item.price, item.attack, item.defence] }}" - 可以用
attr_reader简化实例变量的读取,这样连手动写inventory方法都省了:class Player # 自动生成hp、attack等变量的getter方法 attr_reader :hp, :attack, :defence, :gold, :inventory def initialize(hp, attack, defence, gold) @hp = hp @attack = attack @defence = defence @gold = gold @inventory = [] end # 这里省略buy方法,和上面的写法一致 end
内容的提问来源于stack exchange,提问作者BenjaminJB
相关产品推荐
相关产品推荐

