37

誰かが私にRubyのブロック内のパイプ文字の使用について説明できますか?反復時にデータが割り当てられる変数名が含まれていることを理解しています。しかし、これは何と呼ばれていますか?パイプ内に複数の変数を含めることはできますか?他に知っておくべきことはありますか?それに関するより多くの情報への良いリンクはありますか?

例えば:

25.times { | i | puts i }
4

3 に答える 3

32

中括弧は、ブロックと呼ばれる無名関数を定義します。パイプ間のトークンは、このブロックの引数です。必要な引数の数は、ブロックの使用方法によって異なります。ブロックが評価されるたびに、ブロックを必要とするメソッドは、それを呼び出すオブジェクトに基づいて値を渡します。

これはメソッドの定義と同じですが、ブロックを受け入れるメソッドを超えて保存されないだけです。

例えば:

def my_print(i) 
  puts i
end

実行すると、これと同じように動作します。

{|i| puts i}

唯一の違いは、ブロックがその場で定義され、保存されないことです。

例2:次のステートメントは同等です

25.times &method(:my_print)

25.times {|i| puts i}

ブロックとして渡される関数の大部分は通常、状況に固有であり、再利用のために定義する価値がないため、匿名ブロックを使用します。

では、メソッドがブロックを受け入れるとどうなりますか?それは方法によって異なります。ブロックを受け入れるメソッドは、明確に定義された方法で呼び出し元オブジェクトから値を渡すことによってブロックを呼び出します。返される内容は、ブロックを必要とするメソッドによって異なります。

例:25.times {|i| puts i}.timesでは、0とその呼び出し元の値の間の値ごとに1回ブロックを呼び出し、その値を一時変数iとしてブロックに渡します。Timesは、呼び出し元オブジェクトの値を返します。この場合25。

2つの引数を持つブロックを受け入れるメソッドを見てみましょう。

{:key1 => "value1", :key2 => "value2"}.each {|key,value| 
     puts "This key is: #{key}. Its value is #{value}"
}

この場合、それぞれがキーと値のペアごとにブロック1を呼び出し、キーを最初の引数として渡し、値を2番目の引数として渡します。

于 2010-11-21T22:28:17.090 に答える
5

パイプは、ブロックを呼び出す関数によって値が入力される引数を指定します。それらは0個以上存在する可能性があり、使用する数は呼び出すメソッドによって異なります。

たとえば、each_with_indexは2つの変数を使用し、一方に要素を配置し、もう一方にインデックスを配置します。

ここに、ブロックとイテレータがどのように機能するかについての良い説明があります

于 2010-11-21T22:02:12.637 に答える
2

ブロック引数は、メソッドパラメータと同じ規則に従います(少なくとも1.9以降)。オプションの引数、可変長の引数リスト、デフォルトなどを定義できます。これはかなりまともな要約です。

注意すべき点:ブロックは、定義されたスコープ内の変数を参照するため、既存の変数と同じ名前の引数を渡すと、それが「シャドウ」されます。ブロックは、渡された値と元の変数は変更されません。

i = 10
25.times { | i | puts i }
puts i #=> prints '10'

最後に「10」を出力します。値を渡さない場合でも(つまり、周囲のスコープから誤って変数を壊さないようにしたい場合)、これが望ましい動作になることがあるため、引数リストの後のセミコロンの後にブロックローカル変数名を指定できます。

x = 'foo'
25.times { | i ; x | puts i; x = 'bar' }
puts x #=> prints 'foo'

ここで、'x'は、値が渡されていなくても、ブロックに対してローカルです。

于 2010-11-21T22:27:02.173 に答える