Rails模型中奇怪的实例变量行为

时间:2015-02-13 08:33:34

标签: ruby-on-rails activerecord

让我们考虑以下示例:

class Car < ActiveRecord::Base

  def engine
    @engine ||= Engine.new(self)
  end

end

class Engine

  def initialize(vehicle)
    @vehicle = vehicle
  end

  def model
    @vehicle.model
  end

end

而我不明白的是,当我去控制台并做类似的事情时:

car = Car.last
car.engine.model  # => 'V8'

然后

car.model = 'V6'

我得到了

car.engine.model  # => 'V6'

这显然是一个简化的例子,但无论如何,任何人都可以解释为什么我在最后一行代码中获得了不同的引擎型号名称?是不是应该使用@engine变量并返回以前的引擎型号名称?

1 个答案:

答案 0 :(得分:1)

这里不足为奇。您使用Engine对象初始化car实例,因此@vehicle实例变量引用与car局部变量相同的对象。难怪如果修改car对象,@engine对象将以相同的方式进行修改。