例如,如果我们写
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。