此处定义的属性@color
在哪里?大概是构造函数中的赋值?如果是这种情况,如果一个类型有多个构造函数,其中一个构造函数没有为@color
赋值?该怎么办?
class Baz
def initialize(color)
@color = color
end
def color
@color
end
def color=(value)
@color = value
end
end
答案 0 :(得分:2)
如果一个类型有多个构造函数,其中一个没有为@color
赋值
那么,那些实例将没有@color
实例变量,并且对该变量的操作可能会失败。
希望良好的设计和测试能够将这些案例的数量减少到零,但这并不是语言本身可以保护你的。
请注意,在您的具体示例中,这不应该是一个问题,因为唯一的操作是设置(显然很好)和获取,这也很好 - 如果变量具有,则检索实例变量将返回nil
从未被设定过。
答案 1 :(得分:2)
ruby中的实例变量本身并未“定义”。它们在使用时就会存在。
第一次为实例变量赋值时,这是与“定义”最接近的东西(但实际上它更像是“初始化”)。如果引用尚未赋值的实例变量,则其值为nil
。
因此,如果您的构造函数没有为@color
赋值,那么@color
将保持未初始化状态(从而在引用它的类中的任何其他位置返回nil
...除非它在构造函数之外的其他地方分配了一个值。)
有关详细信息,请参阅此处:http://www.rubyist.net/~slagell/ruby/instancevars.html
文章的相关引用:
不需要声明实例变量。这表明了 灵活的对象结构;实际上,每个实例变量都是 在第一次分配时动态附加到对象。
和
与全局变量一样,实例变量的值为nil值 初始化。