我试图了解实例变量初始化和声明。这样做我尝试了下面的代码。但在我的思考路径的一半,我得到了一些有趣的东西如下:
class Person
attr_accessor :name,:age
def initialize(var)
@sex = var
end
def objctid
p ":age -> #{@age.object_id}"
p ":name -> #{@name.object_id}"
p ":sex -> #{@sex.object_id}"
end
end
#=> nil
ram = Person.new('M')
#=> #<Person:0x2109f48 @sex="M">
ram.objctid
#":age -> 4"
#":name -> 4"
#":sex -> 17321904"
#=> ":sex -> 17321904"
到目前为止我没有使用Object#instance_variable_set
。
符号:age
和:name
如何获取内存引用,因为直到上面我没有将它们初始化?
为什么这些实例变量的object_id
相同?
ram.instance_variable_set(:@age,'14')
#=> "14"
现在在下面的代码@age
中,object_id已更改,因为我使用Object#instance_variable_set
来设置@age
。
ram.objctid
#":age -> 17884656"
#":name -> 4"
#":sex -> 17321904"
#=> ":sex -> 17321904"
ram.instance_variable_set(:@name,'Lalu')
#=> "Lalu"
ram.objctid
#":age -> 16884288"
#":name -> 17041356"
#":sex -> 17625228"
#=> ":sex -> 17625228"
*为什么@age
和@name
的这些不同的object_id? *
答案 0 :(得分:2)
实例变量在首次引用时创建并初始化为nil
。例如:
class C
def m
puts @unset.inspect
end
end
C.new.m
会说nil
。
您没有初始化@age
或@name
,因此当您首次在nil
方法中引用它们时,它们会被创建并初始化为objctid
。由于它们都是nil
,因此只有一个object_id
,它们将具有相同的nil
;将p nil.object_id
添加到objctid
方法可能会很有成效。
答案 1 :(得分:2)
符号:age和:name如何获取内存引用?
因为您没有为它们分配任何值,所以默认情况下它们会得到一个nil
对象
为什么这些实例变量的object_id是相同的?
因为只有一个nil