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の値を修正することができて、正しいかどうかは達人に見てもらいたいです.