2010-12-08 5 views
1

this blogに基づいて、私が同意するこのようなものが動作します。自己が何かに割り当てられているときにエラーが発生しない理由

class Object 
    def tap 
    yield self 
    self 
    end 
end 

は、ここで私はその後、ルビーが爆破すべき自己の値を変更しようとしておりますので、上記の場合には、私の実験

class Lab 
end 

puts Lab.new.tap {|e| e = 'Boom' } 

です。しかし、それは爆破しません。

次に、自己爆発の試みが起こった場合を示します。だから私の質問は、上記の場合にルビーが爆発しない理由です。

class Lab 
    def lab 
    puts self 
    self = 'Boom' #=> exception Can't change the value of self 
    puts self 
    end 
end 
+1

[参照または値によってRubyが渡されますか?](http://stackoverflow.com/questions/1872110/is-ruby-pass-by-reference-or-by-value) –

答えて

4

理由はselfが、このコードsnippletでに割り当てられていない理由と同じです。ただ、それには何か他のものを割り当て

hello = self 
hello = 'foo' 

eがそれに何か他のものを割り当て、ちょうど変数であり、それの現在の値には影響しません。

+0

はeaクローンです自己の?ルビーは参照渡しを使用するので、私はeを変更すると自分自身が変わると思います。 –

+0

'e'は自己への参照を含む変数です。 'e'に何か他のものを代入すると、変数には他のものが含まれます。ここで重要なことは、 'e'は変数であり、変数はオブジェクトへの参照であり、それらはオブジェクトではないということです。 'self'はRubyがあなたに割り当てることのできない特別な変数です。定数として考えることができます(ただし変数には定数が参照と同じオブジェクトへの参照を含むことができるので、' e'は「自己」と同じオブジェクトへの参照ですが、それはそれらのどれもが実際に参照するオブジェクトであるという意味ではありません)。 – Theo

2

しかし、あなたはローカル変数eを割り当てている、selfを割り当てていません。ブロックが開くと、eは、オブジェクトselfが渡されたことを参照します。eは、Stringインスタンスを参照するために再割り当てされます。

関連する問題