Есть ли более быстрый способ определить, какой объект равен нулю в серийных точках?

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?

рядом с обработкой производственного исключения. Я также хочу быстрее найти нулевой объект на этапе разработки.

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


person hey mike    schedule 03.03.2012    source источник


Ответы (2)


Короче говоря, нет.

Однако изменение вашего кода таким образом, чтобы он не нарушал Закон Деметры, разделит эти вызовы, чтобы только один вызов в цепочке.

Например:

a.b.c

это плохо, потому что место, в котором вы вызываете c, не имеет представления c, однако вызов некоторого метода d в классе a, который возвращает b.c, устраняет эту проблему, и вы получаете просто:

a.d
person Andrew Marshall    schedule 03.03.2012

Я не вижу присваивания в вашем коде, поэтому этот код не выдаст эту ошибку. Если вы беспокоитесь о том, что некоторые из них равны нулю, рассмотрите возможность рефакторинга кода в методы, поскольку, когда они равны нулю, вы получите хорошую трассировку стека:

  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 там, где вы их не ожидаете, но если вам нужна хорошая трассировка стека из журналов, это поможет.

person Ben Taitelbaum    schedule 03.03.2012