👋
【bugs.ruby Advent Calender】Exception をパターンマッチに対応する提案【2日目】
bugs.ruby Advent Calender 2日目の記事です。
これはなに
今年1年間通してみてきた bugs.ruby のチケットの中から気になったものを1つずつ取り上げていく Advent Calender です。
取り上げるチケットは基本的にこのブログで取り上げたものになります。
記事のまとめは ここを参照 してください。
[Feature #20164] Add Exception#deconstruct_keys
Exception#deconstruct_keys
メソッドを追加して Exception
オブジェクトでパターンマッチが利用できるようにする提案です。
#deconstruct_keys
を追加することで以下のように各 Exception
オブジェクトが定義されているメソッドの値でパターンマッチすることができます。
begin
#code
rescue => err
case err
# StandardError#message に特定の文字列がある場合
in StandardError(message: /Permission denied/)
abort "please select a different file"
# NameError#name が :foo の場合
in NameError(name: :foo)
retry if require "foo_helper"
else
raise
end
end
#deconstruct_keys
とは Hash のパターンマッチで内部的に呼び出されるメソッドです。
#deconstruct_keys
を定義することで Hash のパターンマッチで利用できるようになります。
class User
def initialize(name:, age:)
@name, @age = name, age
end
# #deconstruct_keys の戻り値の Hash でパターンマッチが実行される
def deconstruct_keys(keys)
# keys に in で渡された {} のキーが配列で渡される
keys.to_h { [_1, instance_variable_get(:"@#{_1}")] }
end
end
user = User.new(name: "homu", age: 14)
if user in { name: "homu", age: }
pp age # => 14
end
このように任意のオブジェクトに対してパターンマッチを利用することができます。
個人的にはパターンマッチは好きな構文でどんどんいろんな書き方ができるようになってほしいので、こういう提案がでてくるのは嬉しいですね。
Exception
もパターンマッチに対応されていると色々と捗りそうなんですが現時点では特に進展はなさそうですね。
Discussion