はじめに
JavaやC言語を勉強した後にRubyでプログラムを実装している。
その際に、最初に実装していたループ文がJavaのような実装内容になっており、
Rubyらしさがなかったため、下記のようにリファクタリングを実施した。
下記よりもRubyらしい記述方法があればご教授いただければ幸いです。
プログラム内容
0から100までの奇数を表示するプログラム
修正前
Rubyの下記文法に即して繰り返し処理を記述。
JavaやC言語でfor文に慣れているため、書きやすい。
for 変数 in オブジェクト do
繰り返し実行する処理
end
loop.rb
for n in 0..100 do
if n % 2 != 0 then
puts n
end
end
修正後
Rubyを勉強していくと繰り返し処理はeachを用いることが一般的であることを認識します。
さらに整数を扱うメソッドodd? even?や
selectのようなインスタンスメソッドを知ることで下記のように
繰り返し処理を修正することができます。
# 自身が奇数であればtrueを返す
3.odd? # 実行結果 true
# selectメソッド
# 各要素をブロックで判定し、true要素だけを返す
array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
puts array.select(&:odd?) # 実行結果 1 3 5 7 9
loop.rb
(0..100).select(&:odd?).each do |n|
puts n
end
最後に
Rubyのfor文は実行時にeachメソッドが実行されているようです。
(上記のような実際は別のメソッドが実行されていることをシンタックスシュガーというらしいです。)
Rubyにおいて繰り返し処理を記述する際は個人的にはeachを推奨いたします。
今回の修正から下記を教訓にしていきたいと思いました。
Rubyに入ってはRubyに従え
他の言語を学ぶ時も同様の精神を持って取り組みたいと思います。