地味すぎて誰も気がついていないCRuby 2.5の新機能

did_you_mean gemがKeyErrorにも効くようになったよ

KeyErrorは指定したkeyに対するvalueが見つからなかったときに起こる例外で、IndexErrorから派生したものです。

KeyErrorが起こり得るのはHash#fetch Hash#fetch_values ENV.fetch Kernel.sprintf String#%の5つです。

このメソッド達で、探したkeyが見つからなかったときに近しい候補をサジェストしてくれるようになっています。

$ ruby
h = {foo: 1, bar: 2}
h.fetch(:bax)
Traceback (most recent call last):
    1: from -:2:in `<main>'
-:2:in `fetch': key not found: :bax (KeyError)
Did you mean?  :bar

実はCRuby 2.4でもrequire "did_you_mean/experimental/key_error_name_correction"と呪文を唱えると、Hash#fetchに対してdid_you_meanが効いていたのですが、やり方に気づかない上にHash#fetchprependでモンキーパッチする危ない実装だったので誰も使っていませんでした。*1

これはイカンと一念発起し、 KeyErrorに2つメソッドを追加しました。

bugs.ruby-lang.org

これで、NameErrorと同じく、エラーオブジェクトに原因となるオブジェクトを紐付けることができるので、モンキーパッチ無しでdid_you_meanを効かせることができます。

github.com

この辺で思いついた機能がついに実を結んだわけですね。

RubyでJSONをclassにmappingするやつと、2つの記法 - スペクトラム

ふるってご利用下さい。*2


*1:作者は私です

*2:本当はdid_you_mean作者のyuki24さんがRubyアドベントカレンダーに登録していたのを見て、ここで紹介されるだろうと思ってたけど、アドベントカレンダーの登録が消えたっぽいのでこのタイミングに。