我有一个像臭的方法:
def search_record(*args)    
  record = expensive_operation_1(foo)
  return record unless record.nil?
  record = expensive_operation_2(foo, bar)
  return record unless record.nil?
  record = expensive_operation_3(baz)
  return record unless record.nil?
  record = expensive_operation_4(foo, baz)
  return record unless record.nil?
end
对于"除非无效"的"回复结果",是否有一个好的红宝石成语?
或者我应该写一个return_unless_nil(&blk)方法?
(注意每个调用的args不同,所以我不能简单地迭代它们)
Jor*_*ing 21
你关心nil和false这里之间的区别吗?如果你只关心每个方法的返回值是否为"falsy",那么这是一种非常Ruby的方式:
def search_record(*args)    
  expensive_operation_1(foo)      ||
  expensive_operation_2(foo, bar) ||
  expensive_operation_3(baz)      ||
  expensive_operation_4(foo, baz)
end
如果你不熟悉这个习语,可以这样解释:Ruby,像大多数语言一样,"短路"或比较,这意味着如果第一个操作数评估为"truey",它就不会费心去评估第二个操作数(即如果expensive_operation_1返回除nilor之外的其他内容false,它将永远不会调用expensive_operation_2),因为它已经知道布尔运算的结果为真.
Ruby所做的另一个有用的事情是,它只返回它评估的最后一个操作数,而不是返回true或false从布尔操作返回.因此,在这种情况下,如果expensive_operation_1返回nil,它将调用expensive_operation_2,如果返回一个值(即非麻烦),整个表达式将只计算该值.
最后,我们可以链接这些布尔值,实际上,它将返回第一个操作数的结果,该操作数不是假的,并且从不评估后续的操作数.如果所有的操作数都评估为falsy,它将返回最后的操作数(我们知道它是假的,在你的情况下,可能是nil).