👋

【bugs.ruby Advent Calender】Exception をパターンマッチに対応する提案【2日目】

2024/12/02に公開

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 もパターンマッチに対応されていると色々と捗りそうなんですが現時点では特に進展はなさそうですね。

関連

GitHubで編集を提案

Discussion