この例でgrepがどのように機能するかを理解しようとしています。コードは機能しますが、イベントがどの順序で発生するか、いつどこで何が返されるかを正しく理解しているかどうかは 100% わかりません。
cars = [:Ford, :Toyota, :Audi, :Honda]
ucased_cars = cars.collect do |c|
c.to_s
end
.grep(/^Ford/) do |car|
puts car.upcase
car.upcase
end
puts "ucased:" + ucased_cars.to_s
私が考えていることは次のとおりです。
- シンボルの配列を定義します
- ブロック内で、cars 配列の各 Symbol 要素 c を String に変換するブロックで collect メソッドを呼び出します。
- collect は文字列の配列を返します
- grep は、collect によって返された文字列の配列に対して呼び出され、grep は検索パターンに一致する各配列要素 car に対して独自のブロックを呼び出し、要素を出力して大文字にし、配列の一部として返します。
- grep は大文字の文字列の配列を返し、それを「ucased_cars」に割り当てます
- 配列 ucased_cars は、出力する前に文字列に変換する必要があります。
ステップ 4 に関する限り、grep の動作を最もよく表しているのは次のうちどれですか。
[A] grep は、パターンに一致するすべての文字列を検索します。grep は、この一致の配列でブロックを呼び出します。grep は、ブロックの結果を呼び出し元の関数に返します。
[B] grep は、パターンに一致する最初の文字列を見つけます。grep は、この一致でブロックを呼び出します。このブロックの戻り値は、一時的にどこかに積み上げられます。grep は、配列の次の要素を検索します。一致する場合、grep はこの一致のブロックを呼び出します。grep は、このブロックの戻り値を戻り値の一時的な「ストレージ」に追加します。grep は、一致するものがなくなるまで、次の配列要素を調べます。次に、grep は積み上げられた戻り値を呼び出し元の関数に渡します。
私の結論:
[A] より理にかなっているようです。
[B] 不必要なごまかしが多く、効率的でもありそうもない。