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

Ruby开发牡蛎卡项目出现NoMethodError,修改初始化代码后修复,求原因

问题原因解答

核心本质

报错是因为实例变量的定义位置错误导致未初始化,Ruby中未声明的实例变量默认值为nil,调用nil的[]=方法自然会抛出NoMethodError。

原代码错误的具体原因

Ruby中@开头的实例变量,作用域和定义位置直接绑定:

  • 你最初把@journey = Hash.new写在initialize方法外、类定义的直接作用域中,这个变量属于类的实例变量,是Oystercard这个类对象本身的属性,不属于你通过Oystercard.new生成的实例对象。
  • 你在touch_in、touch_out等实例方法中访问的@journey,会优先查找当前实例对象自身的实例变量,这个变量你没有做过初始化,默认就是nil,所以赋值操作会失败。

调整后正常运行的原因

initialize是Ruby类的构造方法,每次生成新的类实例时都会自动执行该方法内的代码:

  • 你把@journey = Hash.new移到initialize内部后,每生成一个Oystercard实例,都会给这个实例单独初始化一个属于它自己的空哈希@journey,实例方法中访问到的就是这个已经初始化的哈希对象,自然可以正常赋值。

额外注意事项

你当前的代码中@journey_history也没有在initialize中初始化,后续执行@journey_history.push(journey)时也会触发同样的nil报错,建议在initialize中补充初始化代码:

def initialize
  @balance = 0
  @in_journey = false
  @journey = Hash.new
  @journey_history = []
end

内容的提问来源于stack exchange,提问作者Monkey D Luffy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:24:05