🐈

[bugs.ruby][Feature #20326] 引数が渡されたかどうか判定するためのオブジェクトを追加する提案

2024/03/11に公開

[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
  • 稀によくこういうことをしたいケースはなくはないんですがどう書くとスマートなんですかね
    • わたしの場合は可変長引数でカバーしちゃう事が多いかなあ
GitHubで編集を提案

Discussion