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"

以下のコードでは、@ageobject_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"

* なぜ と の object_id がこんなに違うの@age@name? *

4

2 に答える 2

2

シンボル:ageと:nameはどのようにしてメモリ参照を取得しますか?

値を割り当てていないため、デフォルトで nilオブジェクトを取得します

これらのインスタンス変数のobject_idが同じなのはなぜですか?

1つしかないのでnil

于 2013-03-16T19:31:21.437 に答える
2

インスタンス変数が作成され、nil最初に参照されたときに初期化されます。例えば:

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

と言うでしょうnil

初期化しない@ageか、メソッド内で最初に参照したときに@name作成および初期化されます。それらは両方であるため、1つしかないため、同じになります。メソッドに追加すると、実り多い場合があります。nilobjctidnilobject_idnilp nil.object_idobjctid

于 2013-03-16T19:21:11.017 に答える