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

前端之家收集整理的这篇文章主要介绍了Ruby的attr_accessor是否自动为属性创建实例变量?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
例如,如果我们写
class MyClass
  attr_accessor :something
end

但没有明确创建一个具有实例变量@something的初始化方法,Ruby会自动创建它吗?

解决方法

否.在分配给它们之前,不定义实例变量,而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"]

将东西设置为nil不会导致instance_variables恢复,所以我们可以确保返回的第一个空数组不仅仅是一个instance_variables省略nil值的情况:

x.something = nil # => nil
x.instance_variables # => ["@something"]

您还可以验证这不仅仅是attr_accessor特有的行为:

class Test
  def my_method

    @x # nil

    instance_variables # []

    @x = 3 

    instance_variables # ["@x"]
  end 
end

Test.new.my_method

猜你在找的Ruby相关文章