Menu
Coddy logo textTech

Map のメソッドチェーン

CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 22/56。

基礎編でmapについて学びましたが、これは各要素を変換して新しい配列を作成するものです。その真の力は、selectrejectなどとチェーンさせて使用したときに発揮されます。

各メソッドは配列を返すため、その結果に対して別のメソッドを呼び出すことで処理を継続できます:

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のコードの至る所にあります。見かけたときにそれだと分かるようにしておきましょう。

challenge icon

チャレンジ

簡単

カンマ区切りの単語リストを読み込みます。**3文字**より長い単語を大文字にし、, で繋いで1行に出力してください。

これを1つのチェーンとして構築してください:長いものをselectし、&:upcasemapし、最後に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 を繋げる
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン