0

重複の可能性:
ネストされたparamsハッシュのnilでメソッドを呼び出さないようにするクリーンな方法はありますか?

NoMethodExceptionをキャッチせずに、多次元ハッシュの値が設定されているかどうかを確認する簡単な方法はありますか?

元。:

do_x if cat['level1']['level2']['level3'] != 'value'

問題は、「level2」が存在しない可能性があるため、レシーバーがnilであるということです。

PHPでは、エラーを抑制するために「@」を前に付けることができます。

Rubyでは、チェックをbegin-rescueブロックでラップする必要があります。

PHPのような簡単な解決策はありますか?

4

4 に答える 4

1
do_x if cat['level1']['level2']['level3'] != 'value' rescue nil

これがインラインrescueです。問題は、任意の RuntimeError. 代わりに適切なbegin-rescueブロックを使用する必要があります。

begin
  do_x if cat['level1']['level2']['level3'] != 'value'
rescue NoMethodError => error
  puts error.message
end

そうは言っても、入れ子をなくして問題を完全に回避してみませんか?

do_x if cat['level1.level2.level3'] != 'value'
于 2012-06-15T19:05:41.913 に答える
0
class MyHash < Hash
  def initialize(levels=0)
    super()
    self.default = MyHash.new(levels-1) if levels > 1
  end
end

cat = MyHash.new(3)

cat['level1']                     #=> {}
cat['level1']['level2']           #=> {}
cat['level1']['level2']['level3'] #=> nil
于 2012-06-15T20:03:36.087 に答える
0

レスキューの代わりに try メソッドを使用します。 do_x if cat['level1'].try(:[], 'level2').try(:[], 'level3')したがって、do_x が例外を発生させた場合、それは救出されず、do_x 内で何か問題が発生したかどうかを実際に確認できます。

于 2012-06-15T20:36:25.750 に答える
0

nil で [] を再​​定義して、コードを実行する前に希望どおりに動作させることができます。

class NilClass
  def[](key)
    nil
  end
end
于 2012-06-15T19:15:02.293 に答える