与Ruby中的实例变量对象id分配混淆
我试图理解实例变量初始化和声明。 这样做我尝试了下面的代码。 但是在我思考的一半路上,我得到了一些有趣的东西,如下所示:
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') #=> # 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? *
实例变量在首次引用时创建并初始化为nil
。 例如:
class C def m puts @unset.inspect end end C.new.m
会说nil
。
你没有初始化@age
或@name
所以当你第一次在你的objctid
方法中引用它们时,它们被创建并初始化为nil
。 因为它们都是nil
,所以它们将具有相同的object_id
因为只有一个nil
; 将p nil.object_id
添加到你的objctid
方法可能会很有成效。
符号:age和:name如何获取内存引用?
因为你没有为它们分配任何值,所以默认情况下它们会得到一个nil
对象
为什么这些实例变量的object_id是相同的?
因为只有一个nil