эффективно применять ноль чек в ruby - PullRequest
0 голосов
/ 20 марта 2020

У меня есть этот код

args = x.lead_details.last.leads.last.country_id rescue nil
Function(args)

Я использовал ключевое слово rescue, чтобы убедиться, что я не получаю таких ошибок, как

 undefined method `country_id' for nil:NilClass,
 undefined method `leads' for nil:NilClass

Есть ли какой-нибудь лучший способ добиться этого?

Другой подход

Function(x.lead_details.last.leads.last.country_id if x.present? && x.lead_details.present? && x.lead_details.last? && so on)

Ответы [ 2 ]

4 голосов
/ 20 марта 2020

rescue nil это зло. Это не просто спасти ноль ошибок. Он съедает все, что вы бросаете в него. Например:

class Foo
  def bar
  end

  def woo
    raise ArgumentError
  end
end

Foo.new.baz rescue nil # nil!
Foo.new.woo rescue nil # nil!

Это относится ко всем встроенным спасателям .

Ruby 2.3.0, в которых введен оператор безопасной навигации, который позволяет вам:

x&.lead_details&.last&.leads&.last&.country_id

ActiveSupport также имеет Object # try! метод, который можно использовать в более старых версиях Ruby:

x.try!(:lead_details).try!(:last).try!(:leads).try!(:last).try!(:country_id)

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

См .:

4 голосов
/ 20 марта 2020

Вы можете использовать безопасный оператор навигации (&.), который был введен в Ruby 2.3:

Function(x&.lead_details&.last&.leads&.last&.country_id)

Он возвращает nil, когда вы пытаетесь вызвать метод на nil.

...