Ruby的attr_accessor是否自动为属性创建实例变量?

时间:2013-03-20 02:47:02

标签: ruby

例如,如果我们写

class MyClass
  attr_accessor :something
end

但没有使用实例变量@something显式创建初始化方法,Ruby会自动创建它吗?

2 个答案:

答案 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状态浮动。