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
相关产品推荐
相关产品推荐

