1.今回のテーマ
Rubyの繰り返し処理(eachやmapメソッド等)を使う際、第二引数を指定することで、インデックスを振ることが出来て便利!というお話です。
インデックスとは、1.2.3.4…という番号のこと。
使用用途はたくさんありますが、例えばランキング一覧作成(1位●●2位▲▲3位■■…等の順位の割り振り)等に便利です。
2.インデックスを降らない場合(通常の繰り返し処理)
本題に入る前に、インデックスを付けない場合の繰り返し処理を復習しておきます。
以下通常のeach文です。
@books = Book.all
# Bookモデルの全てのデータをインスタンス変数@booksに代入
@books.each{|book| puts "この本の名前は#{book.name}です"}
# こちら通常のeach文です。@booksをそれぞれbookに代入し、book.nameの値をputsで出力するコードです。
# 以下出力結果の例です。
# => この本の名前はハリーポッターです
# => この本の名前はロードオブザリングです
# => この本の...
3.次にインデックスを付けた場合(each_with_indexメソッド)
@books.each_with_index{|book, index| puts "#{index}:この本の名前は#{book.name}です"}
# 第二引数に新しくindexが加わりました。(※引数名はご自身で好きに変えてOK)
# 以下出力結果の例です。
# => 0:この本の名前はハリーポッターです
# => 1:この本の名前はロードオブザリングです
# => 2:この本の名前はワンピースです
# => 3:この本の名前はキングダムです
出力結果を見てみると、処理された順に0から番号がふられていることがお分かり頂けるかと思います!
でもインデックスの番号が0から始まってしまっています。
通常1から番号を付けることが多いと思うのですが、これではいちいち+1しなければいけなくて不便です。
でも安心してください。
実は番号を1からふりたい!という場合もメソッドが用意されています。
4.インデックスを指定の数字で始める場合(each.with_index(n)) ※n=数字
@books.each.with_index(1){|book, index| puts "#{index}:この本の名前は#{book.name}です"}
# => 1:この本の名前はハリーポッターです
# => 2:この本の名前はロードオブザリングです
先ほどと違う点は2点
①each_with_indexではなくeach.with_index
②each.with_indexの後に(1)で、初期値を1に指定。(100)にすると100から始まります。
5.他のメソッドにwith_indexを付けることも出来る
eachメソッドを例に出してきましたが、その他の繰り返し処理にも使用できます。
mapメソッドを例に例えると、
animals = [dog, cat, rabbit]
animals.map.with_index(1){|animal, i| "#{i}:#{animal}"}
# 以下出力結果の例です。
# => 1:dog
# => 2:cat
# => 3:rabbit
便利ですね!しかし2章で説明したようなmap_with_indexという書き方はこの場合できません!
each_with_indexと書けるのはeachメソッドのみの特権です。
それ以外の繰り返し処理で使用する場合は、with_indexを使用しましょう。
ぜひ活用してみてください
ご覧頂きありがとうございました!