与Ruby中的实例变量对象id分配混淆

时间:2013-03-16 19:11:30

标签: ruby ruby-1.9.3

我试图了解实例变量初始化和声明。这样做我尝试了下面的代码。但在我的思考路径的一半,我得到了一些有趣的东西如下:

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? *

2 个答案:

答案 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