頭をprocsとlambdasに巻き付けたと思ったとき、これが起こります...
irb> x = Proc.new{|name| "Hello #{name}"}
irb> x.class #=> Proc
irb> x.call("Bob") #=> "Hello Bob"
irb> x.class #=> String
irb> x #=> "Bob"
x
呼び出されたときにクラスを変更するのはなぜですか?
私はここで何を誤解している、および/または間違っているのですか?
頭をprocsとlambdasに巻き付けたと思ったとき、これが起こります...
irb> x = Proc.new{|name| "Hello #{name}"}
irb> x.class #=> Proc
irb> x.call("Bob") #=> "Hello Bob"
irb> x.class #=> String
irb> x #=> "Bob"
x
呼び出されたときにクラスを変更するのはなぜですか?
私はここで何を誤解している、および/または間違っているのですか?
まず、あなたのコードには構文エラーがありx = Proc.new {|name| "Hello #{name}"}
ますx = Proc.new (|name| "Hello #{name}"}
。
次に、サンプル コードを実行すると、その動作が得られません。
ただし、name
変数に proc を格納する変数名と同じ名前を付ける場合 (このx
例では)、1.9 より前の Ruby バージョンを使用していた場合、この動作が発生します。
その例を次に示します (x
ブロック変数の名前として使用します。これは ruby 1.8.7 です)。
>> x = Proc.new {|x| "Hello #{x}"}
=> #<Proc:0x00000001013335b8@(irb):1>
>> x.class
=> Proc
>> x.call("Bob")
=> "Hello Bob"
>> x.class
=> String
>> x
=> "Bob"
これは、1.9 より前の ruby では、現在のスコープ外で定義された変数を上書きできるためです。Ruby 1.9 では、この動作はシャドウイングと呼ばれ、ここで説明されています。