关于 实例变量
要点:
- 当调用类的
.new 方法来创建对象实例时,会把所有实参传给 .initialize 方法,用于初始化实例的状态。
- 实例变量名以
@ 开头。
- 实例变量在被显式赋值之前,默认值为
nil。
- 实例变量默认是私有的,应该通过 getter 和 setter 来操作。
class Backpack
initialize(owner)
@owner = owner
end
def owner
@owner
end
def owner=(new_owner)
@owner = new_owner
end
end
- 以
= 结尾命名的方法会被 Ruby 识别为 setter,并且允许使用赋值语法这种“语法糖”,例如 Backpack.new("Sven").owner = "Ayah"。
注意,owner 和 = 之间有一个空格,而实际的方法名是 owner=。
- 可以使用
attr_reader、attr_writer 和 attr_accessor 方法来创建 getter 和 setter:
-
attr_reader:为列出的符号创建 getter
-
attr_writer:为列出的符号创建 setter
-
attr_accessor:为列出的符号创建 getter 和 setter
class Backpack
attr_accessor :owner
initialize(owner)
@owner = owner
end
end
- 为什么要使用 getter 和 setter,而不是直接使用实例变量?
- 如果上一个示例中出现了书写错误(我们称之为“typo”,例如
@ownar),它会静默失败,可能给系统引入 bug。
- getter 和 setter 会让这种错误变得明确,并在出现拼写错误时抛出错误。
参考资料
初始化对象实例
实例变量