我在Ruby中编写了一些内容,在方法调用输出值foo
的情况下,我希望:
foo
是真实的,则返回foo
foo
是假的,请记录错误并返回默认值。实现这一目标的最简单的方法可能是:
foo = procedure(input)
if foo
foo
else
log_error
default
end
但这感觉过于冗长,因为foo
重复了三次,这种风格非常迫切。
写这个最干净,最惯用的方法是什么?
(表现很重要 - 让我们假设foo
在绝大多数情况下是真实的。)
答案 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