在 ruby 中有效地应用 nil 检查

effectively applying nil check in ruby

我有这个代码

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)

您可以使用 Ruby 2.3 中引入的 safe navigation operator (&.):

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

它 returns nil 当您尝试调用 nil 上的方法时。

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!

这适用于任何 inline rescue

Ruby 2.3.0 引入了安全导航运算符,让您可以:

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

ActiveSupport 也有一个对象#try!可以在旧版本 Ruby:

中使用的方法
x.try!(:lead_details).try!(:last).try!(:leads).try!(:last).try!(:country_id)

但你真的只是在惹恼得墨忒耳法则,你应该重构代码,这样你就不必遍历那个疯狂的方法链,因为你实际上只是在掩埋大量潜在的错误并使无法调试。

参见: