ruby 省略 ルビーワンラインレスキュー



ruby rescue 繰り返し (3)

いいね! しかし、それはあなたのパフォーマンスに影響を与えます。 私の経験では、 rescueは引き金となるとはるかに遅くなり、そうでないとわずかに遅くなります。 すべての場合において、 ifは速いです。 考慮すべき他のことは、例外が予想されるべきではないということであり、あなたはこのコードを使用しています。 ハッシュが深くネストされていることは良いリファクタリングが必要ではないという匂いかもしれません

その行に問題が発生した場合に備えて、コード行でrescueを使用できることを最近学びました( http://www.rubyinside.com/21-ruby-tricks-902.html Tip#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例外が投げられた場合、それは救助に巻き込まれて私に欲しいものを与えてくれるでしょう。 それが望ましい振る舞いであれば、nameをnilに設定することもできます。

これを行うことに既知の危険性はありますか? 私はこれが本当であるには余りにもよいようであるので尋ねます。 あまりにも醜いコードがあるので、それを取り除きたいのですが、最初のコード例のように見えます。


Answer #1

この特定の例は、Ruby 2.3のdigメソッドを使って実現できます。

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

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

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


Answer #2

Kernel :: raiseも調べる価値があるかもしれません

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




rescue