预定义变量

Pre-defining variables

这是我的 class 结构:

class Commodity
  def initialize(name)
    @name = name
  end

  class PriceSeries
    def initialize(name)
      @name = name
    end
  end
end

我想实例化 Commodity class:

gold = Commodity.new("gold")

然后实例化 PricePoint class:

gold.xau = Commodity::PriceSeries.new("gold")

看来我只能用黄金class中的一个名为xau的属性访问器来做到这一点。这是定义该变量的唯一方法吗?

def xau
  xau
end

我觉得这不应该是一个函数。

好吧,有很多方法可以做到,但是 attr_accessor 是迄今为止最简单的方法:

class Commodity
  attr_accessor :xau
end

gold = Commodity.new("gold")
gold.xau = some_value

attr_accessor :xau 所做的是定义一个 xau= 方法,该方法将其参数分配给实例变量 @xau,另一个方法 xau returns @xau 的值。换句话说,它基本上是这样做的:

class Commodity
  # Setter
  def xau=(value)
    @xau = value
  end

  # Getter
  def xau
    @xau
  end
end

为了方便和可读性,Ruby允许你在gold.xau = foo中的=之前放置空格,但实际上它与方法调用gold.xau=(foo)相同。

我很确定你想要的是attr_accessor:

class Commodity
  attr_accessor :xau
end

本质上等同于:

class Commodity
  def xau
    @xau
  end
  def xau=(value)
    @xau = value
  end
end

不清楚你想做什么,但看起来你想这样做:

class Commodity
  def initialize(name)
    @name = name
    @xau = Commodity::PriceSeries.new(name)
  end
end

然后,

gold = Commodity.new("gold")

会自动定义

Commodity::PriceSeries.new("gold")

作为gold的实例变量@xau的值。