Edited at

【Ruby】構文とメソッドのループ書き換えメモ

More than 5 years have passed since last update.

以降使う配列サンプル

pcs = [ { :os  => "Windows", :ver => ["XP", "7"] },

{ :os => "Mac", :ver => ["OS X v10.8", "OS X v10.9"] } ]


要素を順に取り出す

何の捻りも無いfor文。

for num in 0..pcs.length do

puts pcs[num]
end

for文を書き換えただけの何の変哲もないeach文。

pcs.each do |pc|

puts pc
end

↓出力結果

{:os=>"Windows", :ver=>["XP", "7"]}

{:os=>"Mac", :ver=>["OS X v10.8", "OS X v10.9"]}


要素とindexを繰り返し取得する

この配列pcからOS名とバージョンを取得するとき、下のように構文とメソッド使っても取得できます。

length = 0

while length < pcs.length do
pcs.each do |pc|
puts "OS:#{pc[:os]}"
puts pc[:ver]
puts "-----"
end
length += 1
end

これをeach_with_indexを使ってメソッドのみで書き換え。

pcs.each_with_index do |pc, length|

puts "OS:#{pc[:os]}"
puts pc[:ver]
puts "-----"
end

↓出力結果

OS:Windows

XP
7
-----
OS:Mac
OS X v10.8
OS X v10.9
-----

下のような書き換えでも同じ出力結果が得られます。

pcs.each_with_index do |pc, length|

puts "OS:#{pc[:os]}"
pc[:ver].length.times.each do |size|
puts pc[:ver][size]
end
puts "-----"
end

pc[:ver].length.times.each do |size| の部分は単純にpc[:ver]の長さ分要素を繰り返しているだけです。

ちなみにこう(↓)すると

puts "方法1"

pcs.each_with_index do |pc, length|
puts "OS:#{pc[:os]}"
puts "Ver:#{pc[:ver]}"
puts "-----"
end

puts "方法2"
pcs.each_with_index do |pc, length|
puts "OS:#{pc[:os]}"
pc[:ver].each do |v|
puts "Ver:#{v}"
end
puts "-----"
end

こう(↓)なります。

方法1

OS:Windows
Ver:["XP", "7"]
-----
OS:Mac
Ver:["OS X v10.8", "OS X v10.9"]
-----

方法2
OS:Windows
Ver:XP
Ver:7
-----
OS:Mac
Ver:OS X v10.8
Ver:OS X v10.9
-----