例如,如果我们写
class MyClass
attr_accessor :something
end
但没有使用实例变量@something
显式创建初始化方法,Ruby会自动创建它吗?
答案 0 :(得分:29)
没有。在分配实例变量之前,不会定义实例变量,attr_accessor
不会自动执行此操作。
尝试访问未定义的实例变量会返回nil
,但不会定义该变量。在您写之前,它们实际上并未定义。 attr_accessor
依赖于此行为,除了定义getter / setter之外什么都不做。
您可以通过查看.instance_variables
:
class Test
attr_accessor :something
end
x
的新实例没有实例变量:
x = Test.new # => #<Test:0xb775314c>
x.instance_variables # => []
调用getter不会导致@something
被定义:
x.something # => nil
x.instance_variables # => []
调用setter 会导致@something
被定义:
x.something = 3 # => 3
x.instance_variables # => ["@something"]
将something
设置回nil
不会导致instance_variables
还原,因此我们可以确定返回的第一个空数组不仅仅是{{1}的情况}省略instance_variables
值:
nil
您还可以验证这不仅仅是针对x.something = nil # => nil
x.instance_variables # => ["@something"]
的行为:
attr_accessor
答案 1 :(得分:2)
排序。在Ruby中,实例变量在首次分配时创建。这对程序员来说是完全透明的。在分配之前,它们默认为零。
例如:
class Foo
attr_accessor :bar
def baz
@nonexistant
end
end
f.bar #=> nil
f.baz #=> nil
f.bar = 4
f.bar #=> 4
在为实例变量赋值之前,它会以未定义的nil状态浮动。