🙌
[Feature #19620] rescue に渡せるオブジェクトの条件を緩和する提案
[Feature #19620] allow non-module rescue filters that implement the === opertor
- 以下のように
rescue
には#===
をもったクラスオブジェクトやモジュールオブジェクトを渡してフィルターすることができる
module FooErrorFilter
def self.===(e)
e.message =~ /foo/
end
end
begin
raise 'foo error'
# FooErrorFilter#=== が true だとその例外をキャッチする
rescue FooErrorFilter => e
p e.message
# => "foo error"
end
- 現状はクラス/モジュールのオブジェクトしか渡すことができないのでその制限を外して任意のオブジェクトを渡せるようにする提案
- 任意のオブジェクトを渡せるようにすると以下のように
Proc
オブジェクトを渡すこともできるようになる
begin
raise 'foo error'
rescue -> e { e.message =~ /foo/ }
p e.message
end
- これができるようになると色々と捗りそうですかね〜〜〜
- どうせならパターンマッチぽくかけるようにしたいのはある
- それとは別にこんな感じでヘルパメソッド定義してそこで動的に Module を生成するようにするのはどうじゃろうか
def match(expr)
Module.new {
define_singleton_method(:===) { |e|
expr === e
}
}
end
begin
raise 'foo error'
# match に #=== を持ったオブジェクトを好きに渡せる
# () がないとシンタックスエラーになった :sob:
rescue match(-> e { e.message =~ /foo/ }) => e
p e.message
# => "foo error"
end
Discussion