🐈
[bugs.ruby][Feature #20326] 引数が渡されたかどうか判定するためのオブジェクトを追加する提案
[Feature #20326] Add an undefined
for use as a default argument.
- 『(
nil
も含めて)引数が渡されなかったこと』を判定するために以下のように書くことがある
class Array
# 『未定義用』のオブジェクトを生成しておく
UNDEFINED = Object.new
def UNDEFINED.inspect = 'UNDEFINED'
UNDEFINED.freeze
def count(item = UNDEFINED)
# 『未定義のオブジェクトが引数の時のみ』引数がなかったと判定する
if item == UNDEFINED
# ...
end
end
end
- このようなオブジェクトを返す
undefined
を追加する提案
class Array
def count(item = undefined)
# #undefined? で判定できる
if item.undefined?
# ...
end
end
end
- これの問題点として『
undefined
を引数として渡すことができる』と指摘されていますね-
hoge(undefined)
みたいにできてしまう - JavaScript と同じ問題が発生する、とも書かれていますね…
-
- 現状だと以下のように簡略的にかけるともコメントされています
class Array
def count(item = (item_not_set = true))
if item_not_set
# 引数が渡されなかった場合
else
# 引数が渡された場合
end
end
end
- これは芸術点が高い
- 他には以下のように『任意の引数が渡されたかどうか』を判定するメソッドを追加するコメントもされていますね
def fetch(item, default = nil)
if arg_given?(:default)
# ...
end
end
- 稀によくこういうことをしたいケースはなくはないんですがどう書くとスマートなんですかね
- わたしの場合は可変長引数でカバーしちゃう事が多いかなあ
Discussion