21

rescue最近、ある行で問題が発生した場合に備えて、その行で使用できることを学びました( http://www.rubyinside.com/21-ruby-tricks-902.htmlヒント#21を参照)。以前は次のようなコードがありました。

if obj['key'] && obj['key']['key2'] && obj['key']['key2']['name']
  name = obj['key']['key2']['name']
else
  name = ''
end

このrescueメソッドを使用すると、そのコードを次のようなものに変更できると思います。

name = obj['key']['key2']['name'] rescue ''

ハッシュへのアクセスのいずれかのレベルでnil例外がスローされた場合、それはレスキューによってキャッチされ、私に''を与える​​必要があります。これは私が望むものです。nilそれが望ましい動作である場合は、名前をに設定することもできます。

これを行うことで既知の危険はありますか?これはあまりにも良さそうなので、私は尋ねます。私は非常に醜いコードを持っているので、最初のコード例のようにそれを取り除きたいと思います。

4

2 に答える 2

15

読みやすい!しかし、それはあなたのパフォーマンスに影響を与えます。私の経験rescueでは、トリガーされたときははるかに遅く、トリガーされていないときは少し遅くなります。すべての場合において、ifはより高速です。他に考慮すべきことは、例外は予期されるべきではなく、あなたはこのコードを使用しているということです。ハッシュが非常に深くネストされていると、リファクタリングが必要になるほど良い匂いになる可能性があります

于 2013-03-13T21:42:23.250 に答える
12

この特定の例は、Ruby2.3のdigメソッドを使用して実行できるようになりました。

name = obj.dig 'key', 'key2', 'name'

これは安全にアクセスobj['key']['key2']['name']し、いずれかのステップが失敗した場合はnilを返します。

(一般に、例外は実際の予期しないエラーに対してのみ使用することをお勧めしますが、このような例では、構文が煩雑な場合は理解できます。)

于 2016-04-15T17:01:37.360 に答える