デフォルト引数の引数が省略されたか判定したいときローカル変数が便利
nil と省略を区別したいなら def m(a, b = (no_b = true)) というのもあるけど
以下はダメな例です。その値が実際にbに渡されているのか、省略した結果bにその値が代入されているのかを区別することができません。nil の部分を任意の値に置き換えても同じです。
code:ruby
# nilが渡されるとダメな例
def m(a, b = nil)
if b
puts "デフォルト引数が省略されていない"
else
puts "デフォルト引数が省略された"
end
p a, b
end
m(:a)
# デフォルト引数が省略された
# :a
# nil
m(:a, nil)
# デフォルト引数が省略された
# :a
# nil
m(:a, :b)
# デフォルト引数が省略されていない
# :a
# :b
デフォルト引数が省略された場合、デフォルト引数の値を求める式が実行されます。値が渡された場合その式が実行されません。この挙動を利用し、以下のようにデフォルト引数が省略されたかどうか判定することができます。
code:ruby
# ローカル変数をつかうとちゃんと判定できて便利
def m(a, b = (no_b = true; nil))
if no_b
puts "デフォルト引数が省略された"
else
puts "デフォルト引数が省略されていない"
end
p a, b
end
m(:a)
# デフォルト引数が省略された
# :a
# nil
m(:a, nil)
# デフォルト引数が省略されていない
# :a
# nil
m(:a, :b)
# デフォルト引数が省略されていない
# :a
# :b