0
undefined method `[]=' for nil:NilClass

コード:

a.b.c.d['test'].e['foo']

私の解決策:

puts "got it: #{a.inspect}"   if a.nil?
puts "got it: #{a.b.inspect}"   if a.b.nil?
puts "got it: #{a.b.c.inspect}"   if a.b.c.nil?

生産例外を処理する横。また、開発段階で nil オブジェクトをより速く見つけることも必要です。

(https://stackoverflow.com/questions/9159032/is-there-a-nicer-way-to-write-this-type-of-nil-check)

4

2 に答える 2

2

要するに、いいえ。

ただし、デメテルの法則に違反しないようにコードを変更すると、これらの呼び出しが分離され、チェーン内の呼び出しが 1 つだけになります。

例えば:

a.b.c

c呼び出す場所には の表現がないため、悪いですが、を返す のクラスでcメソッドdを呼び出すと、この問題が解決され、最終的には次のようになります。ab.c

a.d
于 2012-03-03T17:15:39.150 に答える
1

コードに割り当てが表示されないため、このコードではそのエラーは発生しません。これらの一部がnilであることが心配な場合は、コードをメソッドにリファクタリングすることを検討してください。これらがnilの場合、優れたスタックトレースが得られるからです。

  def a
    # wherever you get a from
  end

  def b
    a.b
  end

  # ... 

  def d(key)
    c.d["key"]
  end

  def e(key)
    d.e["key"]
  end

e("foo") = "value"

はい、それはやり過ぎなので、最善の方法は、予期しない場所にnilを返さないようにすることですが、ログから適切なスタックトレースが必要な場合は、これでうまくいきます。

于 2012-03-03T17:12:03.960 に答える