Ruby - return 一个值(如果为真)或执行任意代码的最简洁方法
Ruby - cleanest way to return a value if truthy, or execute arbitrary code
我正在 Ruby 中编写代码,其中,给定方法调用的输出值 foo
,我想:
- Return
foo
如果 foo
是真实的
- 记录一个错误,如果
foo
是假的,return 一个默认值。
最简单的实现方式可能是:
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
我正在 Ruby 中编写代码,其中,给定方法调用的输出值 foo
,我想:
- Return
foo
如果foo
是真实的 - 记录一个错误,如果
foo
是假的,return 一个默认值。
最简单的实现方式可能是:
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