プログラミングの問題をやってみた。(Ruby)

①まずは、車の情報を新規に登録するための register_dataのメソッドの定義。

俺はまず始めに空のハッシュ「car = {}」と定義した後、キーとなるものを羅列した。以下の通り。(一部は省略する)

car = {}
car[:type] = gets.chomp
car[:fuel_economy] = gets.to_f
car[:capacity] = get.to_i

この記述は、間違ってはいないようだ。模範解答では、

type = gets.chomp
fuel_economy = gets.to_f
capacity = gets.to_i
car = { type: type, fuel_economy: fuel_economy, capacity: capacity }

としていた。なるほど、確かに最後にハッシュを作り、それぞれのキー名の変数名を作るという記述の仕方なら、まとまりがあって良いかもしれない。

②続いてだ。登録した車の一覧(register_dataで入力し、cars配列内にあるもの)を表示するshow_carsメソッドの定義。

模範解答の「cars.each_with_index |car, index|」、つまり、配列のインデックス番号(配列の要素番号)が取得できる「each_with_index」を、正確に理解していなかった。

例えば、

配列.each_with_index do |item, i|
"#{i}番目のデータは、#{item}"です。
end

とすると、配列の番号(index)に応じたハッシュが出てくる。気をつけないといけないのが、配列の番号は「0」から始まるということ。もし、「1」から始めたいときは、2行目の#{i}を、#{i + 1}とすれば良い。少し乱暴だが...

話を模範解答に戻すと、

cars.each_with_index do |car, index|
puts "[#{index}]: #{car[:type]}"
end
puts "確認したい番号を入力して下さい。"
input = gets.to_i
car = cars[input]
if car
show_data(car)
else
puts "該当する番号はありません。"
end

これにより、2行目のputs文で、配列の要素番号に応じた車種を表示できる。そして、要素番号を相手に入力してもらう。6行目は、入力した要素番号を取り出し(右辺cars[input])、変数carに代入している。そこから先は、if文。もし、変数carがあれば、データを見せる。※コードを書く際は、(引数)も記述することを忘れるな。該当する番号がなければ、「該当する番号はありません」と表示している。

ハッシュの中身を文字列オブジェクトとして使いたい場合は、

"俺の名は、#{ハッシュ名[:キー名]}。" としよう。

③燃料消費量のメソッドだ。

def calculate_fuel_consumption(car, distance)
fuel_consumption = distance / car[:fuel_economy]
puts "その目的地までは、ガソリンを#{fuel_consumption.round(1)}L消費します。"
end

3行目の「.round(1)」は、小数点以下N桁の四捨五入するメソッドだ。引数にNを渡そう。.round(N)

といった感じだな。自分の弱点は、配列オブジェクトのメソッドやオプションが覚えられていなかったこと、どれとどれが仮引数と実引数で、どこのメソッドにこれはつながっているのかまだ認識が甘いことだ。

特に引数は訓練が必要だ。もっと詰めて行こう。