Ruby 救援和最佳实践语法
Ruby rescue and best practice syntax
我有一些看起来与此类似的代码:
foo = SomeActiveRecordModel.where(bar: 10).first.foo rescue ''
一旦我开始使用 Rubocop,它就对我大喊大叫,要求我使用救援语法。所以我认为至少还有两种其他方法可以编写此代码:
foo =
begin
foo = SomeActiveRecordModel.where(bar: 10).first.foo
rescue NoMethodError
''
end
并且:
foo = SomeActiveRecordModel.where(bar: 10).first
foo.present? ? foo.foo : ''
首选这些方式中的哪一种,或者是否有首选的替代方式?
从现在开始,两者都不是首选方式。首选方式是:
foo = SomeActiveRecordModel.where(bar: 10).first&.foo || ""
通常的经验法则是例外情况应保留用于特殊情况,即您在正常控制流中不希望出现的情况。一方面,它们通常比替代品慢。
以下是我更喜欢的场景:
foo = SomeActiveRecordModel.find_by_bar(10).try(:foo) || ''
异常处理是为了处理异常情况。显然,有时可能没有记录。用捕获 NoMethodError
来处理它绝对是错误的做法。一方面,它不仅会捕获 "no method foo on nil:NilClass",还会捕获所有其他 "no method" 错误,这些错误可能会发生(某处打字错误等)。
因此,"record not found" 作为一个非特殊情况,您必须这样处理它,并带有某种条件。
foo = SomeActiveRecordModel.where(bar: 10).first
return '' unless foo
foo.bar
我有一些看起来与此类似的代码:
foo = SomeActiveRecordModel.where(bar: 10).first.foo rescue ''
一旦我开始使用 Rubocop,它就对我大喊大叫,要求我使用救援语法。所以我认为至少还有两种其他方法可以编写此代码:
foo =
begin
foo = SomeActiveRecordModel.where(bar: 10).first.foo
rescue NoMethodError
''
end
并且:
foo = SomeActiveRecordModel.where(bar: 10).first
foo.present? ? foo.foo : ''
首选这些方式中的哪一种,或者是否有首选的替代方式?
从现在开始,两者都不是首选方式。首选方式是:
foo = SomeActiveRecordModel.where(bar: 10).first&.foo || ""
通常的经验法则是例外情况应保留用于特殊情况,即您在正常控制流中不希望出现的情况。一方面,它们通常比替代品慢。
以下是我更喜欢的场景:
foo = SomeActiveRecordModel.find_by_bar(10).try(:foo) || ''
异常处理是为了处理异常情况。显然,有时可能没有记录。用捕获 NoMethodError
来处理它绝对是错误的做法。一方面,它不仅会捕获 "no method foo on nil:NilClass",还会捕获所有其他 "no method" 错误,这些错误可能会发生(某处打字错误等)。
因此,"record not found" 作为一个非特殊情况,您必须这样处理它,并带有某种条件。
foo = SomeActiveRecordModel.where(bar: 10).first
return '' unless foo
foo.bar