Ruby - 最简洁的方法,如果truthy返回一个值,或执行任意代码

时间:2015-10-27 13:53:20

标签: ruby performance idioms idiomatic

我在Ruby中编写了一些内容,在方法调用输出值foo的情况下,我希望:

  • 如果foo是真实的,则返回foo
  • 如果foo是假的,请记录错误并返回默认值。

实现这一目标的最简单的方法可能是:

foo = procedure(input)

if foo
  foo
else
  log_error
  default
end

但这感觉过于冗长,因为foo重复了三次,这种风格非常迫切。

写这个最干净,最惯用的方法是什么?

(表现很重要 - 让我们假设foo在绝大多数情况下是真实的。)

5 个答案:

答案 0 :(得分:5)

依靠Ruby的Perl遗产:

foo = procedure(input) and return foo
log_error
default

答案 1 :(得分:3)

这是一个罕见的案例,其中Ruby的匿名块实际上是有用的:

foo = procedure(input) || begin
  log_error
  default
end

答案 2 :(得分:2)

如果log_error返回真值

,您可以写出来
foo || log_error && default

如果不是:

foo || (log_error; default)

答案 3 :(得分:0)

为了完整起见(因为还没有人发布)我会在原来的尝试中添加一个答案:

procedure(input) || proc {
  log_error
  default
}.call

我想不出任何理由在@ mwp的回答中使用它:

procedure(input) || begin
  log_error
  default
end

因为创建Proc对象所涉及的额外开销(性能和可读性)。虽然一些快速基准测试表明在大多数情况下性能差异应该可以忽略不计,因为除非procedure(input)是假的,否则似乎不会创建Proc对象。

答案 4 :(得分:0)

考虑到所有事情,我会选择:

foo = procedure(input)
return foo if foo
log_error
default