Map のメソッドチェーン
CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 22/56。
基礎編でmapについて学びましたが、これは各要素を変換して新しい配列を作成するものです。その真の力は、selectやrejectなどとチェーンさせて使用したときに発揮されます。
各メソッドは配列を返すため、その結果に対して別のメソッドを呼び出すことで処理を継続できます:
numbers = [1, 2, 3, 4, 5]
result = numbers
.select { |n| n.odd? }
.map { |n| n * 10 }
puts result.inspect # [10, 30, 50]チェーンを上から下に読みます:数値から始め、奇数だけを残し、それぞれを10倍にします。一時変数もループも使いません。
ショートカット &:method_name は、ブロックが1つのメソッドを呼び出すだけの場合に機能します:
["hi", "yo"].map { |s| s.upcase } # ["HI", "YO"]
["hi", "yo"].map(&:upcase) # ["HI", "YO"] (同じ)この省略形はRubyのコードの至る所にあります。見かけたときにそれだと分かるようにしておきましょう。
チャレンジ
簡単カンマ区切りの単語リストを読み込みます。**3文字**より長い単語を大文字にし、, で繋いで1行に出力してください。
これを1つのチェーンとして構築してください:長いものをselectし、&:upcaseでmapし、最後にjoinします。
入力がhi,hello,yo,coddy,supの場合、出力は以下のようになります:
HELLO, CODDYチートシート
配列メソッドをチェーンさせることができます。各メソッドは新しい配列を返すため、その結果に対してさらにメソッドを呼び出し続けることができます:
numbers = [1, 2, 3, 4, 5]
result = numbers
.select { |n| n.odd? }
.map { |n| n * 10 }
# [10, 30, 50]ブロックが1つのメソッドを呼び出すだけの場合は、ショートカットとして &:method_name を使用します:
["hi", "yo"].map(&:upcase) # ["HI", "YO"]自分で試してみよう
words = gets.chomp.split(",")
# TODO: select + map(&:upcase) + join を繋げる
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
5Enumerable の強力な機能
Select と RejectMap のメソッドチェーンReduce / Injectcount, all?, any?, none?group_by と partitionsort_by, min_by, max_byまとめ:データパイプライン