📝
[Feature #21545] TypeError が発生しない #dig メソッドを追加する提案
[Feature #21545] #try_dig, a dig that returns early if it cannot dig deeper
-
#digは参照するオブジェクトに#digメソッドがないと次のようにTypeErrorが発生する
{ a: "foo" }.dig(:a, :b)
# => error: String does not have #dig method (TypeError)
- こういう場合に
TypeErrorにせずnilを返すようにする#try_digを追加するチケット
{ a: "foo" }.try_dig(:a, :b)
# => nil
- 具体的な利用ケースとしては以下のように API のレスポンスのデータ構造に依存せずに
#digをする、みたいな例が提示されている
api_response = { status: "ok" }
api_response.try_dig(:status, :code) # => nil
api_response = { status: { code: 200 } }
api_response.try_dig(:status, :code) # => 200
- 色々とコメントが書かれているんですが matz 的には
exception: trueみたいなキーワード引数で制御する案を提示している - 他には
api_response.dig(:status, :code) rescue nilや以下のようなパターンマッチの代替案とかも提示されている
def match(input)
case input
in { status: { code: Integer => status } }
puts "Status code: #{status}"
in { status: status }
puts "Other status: #{status}"
else
raise "mismatch: #{input}"
end
end
match({ status: "ok" })
match({ status: { code: 200 } })
- あんまりこの手のメソッドがほしいと思ったことはなかったけどどうだったかなあ
Discussion