预定义变量

时间:2015-02-09 20:12:22

标签: ruby variables

这是我的班级结构:

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

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

我想实例化Commodity类:

gold = Commodity.new("gold")

然后实例化PricePoint类:

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

似乎我只能在gold类中使用名为xau的属性访问器来执行此操作。这是定义该变量的唯一方法吗?

def xau
  xau
end

我觉得这不应该是一种功能。

3 个答案:

答案 0 :(得分:1)

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

class Commodity
  attr_accessor :xau
end

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

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

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

  # Getter
  def xau
    @xau
  end
end

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

答案 1 :(得分:0)

我非常确定你想要的是attr_accessor

class Commodity
  attr_accessor :xau
end

这基本上等同于:

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

答案 2 :(得分:0)

目前尚不清楚您想要做什么,但看起来您想要这样做:

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

然后,

gold = Commodity.new("gold")

会自动定义

Commodity::PriceSeries.new("gold")

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