デフォルト値を設定する理由
3日目です。
本日の学習で「デフォルト値って何で設定するんだろう、、」と強く疑問に思ったので、自分なりに理解するまでの流れを書きます。
疑問
・進めている「チェリー本」の例題「長さの単位変換プログラムを作成する」にて
終盤、下記の説明が出てきました
ーーーーーーーーーーー
「キーワード引数を受け取るように実装コードを変更しましょう。デフォルト値はなくてもいいのですが、ここではどちらもメートル(:m)を受け取るようにします。
def convert_length(length, from: :m, to: :m)
units = { m: 1.0, ft: 3.28, in: 39.37, }
( length / units[from] * units[to])
end
ーーーーーーーーーーー
最初、突如現れた:m × 2 に対して頭がついて行かず、10分ほど混乱してました。
なぜfromもtoもmが入るんだ?と、、
〜理解するまで
「デフォルト値設定しなくても良いって言ってるから、こうしても良いのかな?」
ーーーーーーーーーーー
def convert_length(length, from:, to: )
units = { m: 1.0, ft: 3.28, in: 39.37, }
( length / units[from] * units[to])
end
ーーーーーーーーーーー
↓
1 runs, 3 assettions, 0 failures, 0 errors, 0 skips
「あ、テスト成功した」
「このほうが分かりやすいなあ、:mってよく分からないし要らなくね?」
↓
そもそも「デフォルト値」って何かよく分かってなかったな
↓
・特に変更しなかったら(入力しなかったら)デフォルト値を出力するため。
↓
「なるほど、それならテストコードを下記のように変更しても良さそう!」
ーーーーーーーーーーー
class
def
:
assert_equal 10670.73, convert_length(35000, from: :ft, to: :m)
assert_equal 1.0, convert_length(1)
end
end
ーーーーーーーーーーー
↓
1 runs, 4 assettions, 0 failures, 0 errors, 0 skips
「テスト成功した!!」
「そうなると、仮に下記のようにしたら失敗するよな」
↓
ーーーーーーーーーーー
class
def
:
assert_equal 10670.73, convert_length(35000, from: :ft, to: :m)
assert_equal 1.0, convert_length(35000)
end
end
ーーーーーーーーーーー
↓
ーーーーーーーーーーー
1) Failure:
Expected: 1.0
Actual: 35000.0
1 runs, 4 assertions, 1 failures, 0 errors, 0 skips
ーーーーーーーーーーー
「デフォルト値をfromもtoも:mにしているため、結果は1.0が帰ってくるから他の数字だと失敗が出るんだ!」
「デフォルト値を設定せずに下記のようにしたらエラーが出るのかな?」
↓
ーーーーーーーーーーー
class
def
:
assert_equal 10670.73, convert_length(35000, from: :ft, to: :m)
assert_equal 1.0, convert_length(1)
end
end
def convert_length(length, from:, to: )
units = { m: 1.0, ft: 3.28, in: 39.37, }
( length / units[from] * units[to])
end
ーーーーーーーーーーー
↓
1) Error:
ArgumentError: missing keywords: from, to
convert_length.rb:2:in `convert_length'
test/convert_length_test.rb:10:in `test_convert_length'
1 runs, 3 assertions, 0 failures, 1 errors, 0 skips
ーーーーーーーーーーー
「やっぱりエラーでた!」
「デフォルト値を設定したのは変換前と変換後の単位を入力しなかった時でもエラーが出ないようにするためだったのかな?」と自分なりに結論が出ました。
以上です。
本日はチェリー本第5章まで無事終わりました。
明日は第6章まで終わらせます!