🐈

[Feature #14602] 見つからなかったときに例外を発生させる #dig! を追加する提案

2024/05/02に公開

[Feature #14602] Version of dig that raises error if a key is not present

  • ネストして Hash を参照する時に指定したキーがみつからなかったら KeyError を発生させる #dig! を追加する提案
    • 要は #dig でみつからなかったら例外を排出する版
  • 現状、同等のことをしたい場合は以下のように #fetch をネストして参照する必要がある
hash = {
  :name => {
    :first => "Ariel",
    :last => "Caplan"
  }
}

# OK
hash.fetch(:name).fetch(:first)

# Error: key not found: :middle (KeyError)
hash.fetch(:name).fetch(:middle)
  • #dig! のイメージは以下のような感じ
hash = {
  :name => {
    :first => "Ariel",
    :last => "Caplan"
  }
}
hash.dig!(:name, :first)       # => Ariel
hash.dig!(:name, :middle)      # raises KeyError (key not found: :middle)
hash.dig!(:name, :first, :foo) # raises TypeError (String does not have #dig! method)
  • hash.dig(:name, :middle, raise_error: true) みたいな感じで #dig にキーワード引数を追加する案もでているんですが現状だとキーワード引数は位置引数に置き換えられて動いているので互換性がないらしい
hash = {
  :name => {
    :middle => {
      { :raise_error => true } => 2
    }
  }
}

# raise_error: true 自体が Hash 値になり、それがキーの値として処理される
p hash.dig(:name, :middle, raise_error: true)
# => 2
GitHubで編集を提案

Discussion