2

頭を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呼び出されたときにクラスを変更するのはなぜですか?

私はここで何を誤解している、および/または間違っているのですか?

4

1 に答える 1

3

まず、あなたのコードには構文エラーがあり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 では、この動作はシャドウイングと呼ばれ、ここで説明されています。

于 2011-07-15T13:57:12.827 に答える