Ruby - 这里的属性定义在哪里?

时间:2012-01-25 11:42:01

标签: ruby attributes

此处定义的属性@color在哪里?大概是构造函数中的赋值?如果是这种情况,如果一个类型有多个构造函数,其中一个构造函数没有为@color赋值?该怎么办?

class Baz
  def initialize(color)
    @color = color
  end

  def color
    @color
  end

  def color=(value)
    @color = value
  end
end

2 个答案:

答案 0 :(得分:2)

  

如果一个类型有多个构造函数,其中一个没有为@color

赋值

那么,那些实例将没有@color实例变量,并且对该变量的操作可能会失败。

希望良好的设计和测试能够将这些案例的数量减少到零,但这并不是语言本身可以保护你的。

请注意,在您的具体示例中,这不应该是一个问题,因为唯一的操作是设置(显然很好)和获取,这也很好 - 如果变量具有,则检索实例变量将返回nil从未被设定过。

答案 1 :(得分:2)

ruby​​中的实例变量本身并未“定义”。它们在使用时就会存在。

第一次为实例变量赋值时,这是与“定义”最接近的东西(但实际上它更像是“初始化”)。如果引用尚未赋值的实例变量,则其值为nil

因此,如果您的构造函数没有为@color赋值,那么@color将保持未初始化状态(从而在引用它的类中的任何其他位置返回nil ...除非它在构造函数之外的其他地方分配了一个值。)

有关详细信息,请参阅此处:http://www.rubyist.net/~slagell/ruby/instancevars.html

文章的相关引用:

  

不需要声明实例变量。这表明了   灵活的对象结构;实际上,每个实例变量都是   在第一次分配时动态附加到对象。

  

与全局变量一样,实例变量的值为nil值   初始化。