Ruby - return 一个值(如果为真)或执行任意代码的最简洁方法

Ruby - cleanest way to return a value if truthy, or execute arbitrary code

我正在 Ruby 中编写代码,其中,给定方法调用的输出值 foo,我想:

最简单的实现方式可能是:

foo = procedure(input)

if foo
  foo
else
  log_error
  default
end

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

最简洁、最惯用的写法是什么?

(性能很重要——让我们假设 foo 在绝大多数情况下都是真实的。)

你可以这样写 如果 log_error returns 一个真值

foo || log_error && default

如果没有:

foo || (log_error; default)

靠 Ruby 的 Perl 遗产为生:

foo = procedure(input) and return foo
log_error
default

这是 Ruby 的匿名块实际有用的罕见情况:

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

为了完整起见(因为还没有人发布),我将添加我最初的回答尝试:

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

我想不出有什么理由在@mwp 的回答上使用它:

procedure(input) || begin
  log_error
  default
end

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

综合考虑,我会选择:

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