与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