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#fetchをprependでモンキーパッチする危ない実装だったので誰も使っていませんでした。*1
これはイカンと一念発起し、 KeyErrorに2つメソッドを追加しました。
これで、NameErrorと同じく、エラーオブジェクトに原因となるオブジェクトを紐付けることができるので、モンキーパッチ無しでdid_you_meanを効かせることができます。
この辺で思いついた機能がついに実を結んだわけですね。
RubyでJSONをclassにmappingするやつと、2つの記法 - スペクトラム
ふるってご利用下さい。*2
CRubyに僕が入れた、地味すぎてどこにも紹介されていない新機能を試してニヤニヤしてる
— ガチホコ (@_ksss_) 2017年12月26日
*1:作者は私です
*2:本当はdid_you_mean作者のyuki24さんがRubyのアドベントカレンダーに登録していたのを見て、ここで紹介されるだろうと思ってたけど、アドベントカレンダーの登録が消えたっぽいのでこのタイミングに。