在 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)
但你真的只是在惹恼得墨忒耳法则,你应该重构代码,这样你就不必遍历那个疯狂的方法链,因为你实际上只是在掩埋大量潜在的错误并使无法调试。
参见:
我有这个代码
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)
但你真的只是在惹恼得墨忒耳法则,你应该重构代码,这样你就不必遍历那个疯狂的方法链,因为你实际上只是在掩埋大量潜在的错误并使无法调试。
参见: