Есть ли быстрее определить, какой объект имеет нулевое значение в последовательных точках? - PullRequest
0 голосов
/ 03 марта 2012
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)

Ответы [ 2 ]

2 голосов
/ 03 марта 2012

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

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

Например:

a.b.c

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

a.d
1 голос
/ 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"

Да, это излишне, поэтомулучший способ - убедиться, что вы не возвращаете nils там, где вы этого не ожидаете, но если вам нужна хорошая трассировка стека из журналов, это поможет.

...