ruby小さなコードはあなたの引用タイプの功力を測定します
1767 ワード
class Fixnum
attr_accessor :value
end
x=1
p x.object_id
x.value="Anleb"
p x.value.object_id
def change(x)
p x.object_id
p x.value.object_id
#x=2
x.value="Mr.w"
p x.object_id
p x.value.object_id
end
change x
p x
p x.value
p x.object_id
p x.value.object_id
印刷:
3
5875824
3
5875824
3
5875704
1
"Mr.w"
3
5875704
みんなはまたフォーラムの上ですでにこの方法を伝達したのは値で、やはり引用して、すべて言い尽くして、ここで基礎を言いません.
コードを見て、#x=2がコメントしなければ、コードの結果は次のようになります.
class Fixnum
attr_accessor :value
end
x=1
p x.object_id
x.value="Anleb"
p x.value.object_id
def change(x)
p x.object_id
p x.value.object_id
x=2 #
x.value="Mr.w"
p x.object_id
p x.value.object_id
#x GC
end
change x
p x
p x.value
p x.object_id
p x.value.object_id
3
22950360
3
22950360
5
22950290
1
"Anleb"
3
22950360
このコードはよく理解できます.これは私たちの普通の方法では伝達された値を変えることができない例です.具体的には、理由は言いませんが、方法の内部変数がポインタを変えたことを知っています.方法を終了すると、ポインタが破棄され、xがトップドメインxに戻って元の指針になります.
今、なぜ#x=2を注釈したのか、結果が変わるのか、attr_accessor :value
このコードは次のようなものです.
def value=(value)
@value=value
end
def value
@value
end
注意していないで、返すのは直接@valueで、だからオブジェクトの中のvalueの値を修正することができて、正しいかどうかは達人に見てもらいたいです.