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

简而言之,没有。

但是,修改您的代码使其不违反得墨忒耳法则会将这些调用分开,因此链中只有一个调用。

例如:

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"

是的,这是矫枉过正,所以最好的方法是确保你不会在你不期望它们的地方返回 nils,但是如果你需要从日志中获得良好的堆栈跟踪,这将起到作用。

于 2012-03-03T17:12:03.960 回答