Ruby中的虚拟属性

vik*_*027 2 ruby virtual attributes

我正在阅读一篇ruby教程并尝试使用了解虚拟属性的方式.这是教程中显示的示例.

class Spaceship
  def destination
    @autopilot.destination
  end

  def destination=(new_destination)
    @autopilot.destination = new_destination
  end
end

ship = Spaceship.new
ship.destination = "Earth"
puts ship.destination
Run Code Online (Sandbox Code Playgroud)

根据教程,这段代码应该理想地返回地球,但我遇到了以下错误.

class.rb:7:in `destination=': undefined method `destination=' for nil:NilClass (NoMethodError) from class.rb:12:in `<main>'
Run Code Online (Sandbox Code Playgroud)

对不起,但无法确定缺失的部分.

SHS*_*SHS 5

你需要为@autopilot变量分配一些东西.

这样的事情应该有效:

class Spaceship
  def initialize
    @autopilot = Struct.new(:destination).new(nil)
  end

  def destination
    @autopilot.destination
  end

  def destination=(new_destination)
    @autopilot.destination = new_destination
  end
end
Run Code Online (Sandbox Code Playgroud)

但是如果要添加虚拟属性,请将值保存为简单的实例变量,如下所示:

class Spaceship
  def destination
    @destination
  end

  def destination=(new_destination)
    @destination = new_destination
  end
end
Run Code Online (Sandbox Code Playgroud)