You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用push方法添加元素后Array仍为空的问题排查(附Player类代码)

问题分析与修复方案

嘿,我一眼就瞅出你代码里的问题了——调用buy方法往@inventory里添加元素后数组还是空的,核心原因出在你的inventory方法和初始化逻辑上,咱们一步步拆解:

为什么数组一直为空?

你写的inventory方法每次被调用时,都会强制把@inventory重置成空数组:

def inventory
  @inventory = []
end

而你在initialize里还特意调用了这个方法:@inventory = inventory。这就导致:

  1. 初始化时确实能得到空数组,但这个方法的逻辑完全错了——它的作用应该是返回当前的背包内容,而不是每次调用都清空背包。
  2. 要是后续不小心调用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:58:52