【问题标题】:Weird instance variable behaviour in Rails modelRails 模型中奇怪的实例变量行为
【发布时间】:2023-03-29 17:30:01
【问题描述】:

让我们考虑以下示例:

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 变量并返回之前的引擎型号名称吗?

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    这并不奇怪。您使用car 对象初始化Engine 实例,因此@vehicle 实例变量引用与car 局部变量相同的对象。难怪如果你修改car对象,@engine对象也会以同样的方式被修改。

    【讨论】:

    • 我明白了,谢谢。引擎方法是否像我实现它的方式那样安全,或者最好在每次调用时创建一个新的引擎实例,以确保在某些汽车属性发生变化时始终获得正确的信息?
    • @JustMichael 在这方面没有区别。如果每次调用Car#engine 方法时都实例化Engine,它仍然会返回更改后的Car 属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2021-10-27
    相关资源
    最近更新 更多