かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Ruby ループで配列のindexを取得したい。

Rubyeachメソッドはハッシュだとキーが一緒に取得できるが、配列だとインデックスは取得できない。

HashとArray(配列)のeach

Hash

hash = {commander: "Mika", gunner: "Aki", driver: "Mikko"}

hash.each{|key, value|
  puts "#{key} => #{value}"
}

 
Array

arg = ["Mika", "Aki", "Mikko"]

arg.each{|value|
  puts value
}

# 引数を書いてもエラーにはならないが取得はできない
arg.each{|index, value|
  p index # valueが出力される
  p value # nil
}

each_with_index

each_with_index(*args) { |obj, i| block } → enum click to toggle source
配列をループで回してインデックスも欲しい時はeach_with_indexメソッドを使う。
厳密にはEnumerableクラスのメソッドになるっぽい。

arg = ["Mika", "Aki", "Mikko"]

arg.each_with_index{|value, index|
  puts "#{index} => #{value}"
}

ハッシュの時、eachメソッドの引数は|key, value|だけど、each_with_indexの引数は|value, index|と逆なので注意が必要。

each.with_indexという書き方もできるっぽい。
この場合も引数は|value, index|

arg = ["Mika", "Aki", "Mikko"]

arg.each.with_index{|value, index|
  puts "#{index} => #{value}"
}

インデックスだけ取得したい時 each_index

each_index { |index| block } → ary

arg = ["Mika", "Aki", "Mikko"]

arg.each_index{|index|
  puts index
}

使いドコロがあまり思い浮かばない
 
 
key, valueって順番に馴染みがあるので、each_with_indexのvalue, indexって順番は慣れが必要そう。
後、Rubyのループの書き方はdo ~ endで書くのと{ ... }で書くのどっちが主流な感じなんでしょうか?


たのしいRuby 第5版

たのしいRuby 第5版