1. ホーム
  2. ruby

[解決済み] Rubyがブロックの中でパイプ文字を使うことについて、誰か説明してください。

2022-02-07 21:39:21

質問

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

例えば

25.times { | i | puts i }

解決方法は?

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

ブロックを受け付けたメソッドの先には格納されないだけで、メソッドの定義と同じです。

例えば

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としてブロックに渡します。この場合、25です。

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

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

この場合、各ブロックはキーと値のペアごとに、第1引数にキー、第2引数に値を渡して呼び出されます。