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のアドベントカレンダーに登録していたのを見て、ここで紹介されるだろうと思ってたけど、アドベントカレンダーの登録が消えたっぽいのでこのタイミングに。