0

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

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"

现在在下面的代码中,@ages 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* 为什么和的object_id 如此不同@name?*

4

2 回答 2

2

实例变量nil在第一次被引用时被创建和初始化。例如:

class C
    def m
        puts @unset.inspect
    end
end
C.new.m

会说nil

当您第一次在方法中引用它们时,您不会初始化它们并被创建和@age初始化。既然他们都是,他们将拥有相同的,因为只有一个;添加到您的方法中可能会很有成效。@namenilobjctidnilobject_idnilp nil.object_idobjctid

于 2013-03-16T19:21:11.017 回答
2

符号 :age 和 :name 如何获取内存引用?

因为您没有为它们分配任何值,所以默认情况下它们会得到一个 nil对象

为什么这些实例变量的 object_id 相同?

因为只有一个nil

于 2013-03-16T19:31:21.437 回答