【问题标题】:Is there a faster to determine which object is nil in a serial dots?是否有更快的方法来确定连续点中哪个对象为零?
【发布时间】:2012-03-03 17:01:49
【问题描述】:
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)

【问题讨论】:

    标签: ruby try-catch rescue


    【解决方案1】:

    简而言之,没有。

    但是,修改您的代码使其不违反Law of Demeter 会将这些调用分开,因此链中只有一个调用。

    例如:

    a.b.c
    

    很糟糕,因为您调用c 的地方没有c 的表示,但是,在a 的类中调用一些方法d 返回b.c 可以解决这个问题并且你最终会得到:

    a.d
    

    【讨论】:

      【解决方案2】:

      我没有在您的代码中看到分配,因此此代码不会产生该错误。如果你担心其中一些是 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,但如果您需要从日志中获得良好的堆栈跟踪,这会解决问题。

      【讨论】:

        猜你喜欢
        • 2017-07-08
        • 2015-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-05
        • 2020-01-10
        • 1970-01-01
        相关资源
        最近更新 更多