2010-07-12 89 views
4

我喜欢明智地使用三元条件运算符。在我看来,它非常简洁。ruby​​ idiom:谓词和条件运算符

然而,在Ruby中,我发现我经常测试断言方法,这已经有了自己的问号:

some_method(x.predicate? ? foo : bar) 

我被这两个问题震动标志着如此接近对方。是否有一个等效的紧凑和可读的替代方案?

回答

8

最近的简洁表达,你可以得到的是

x.predicate? && foo || bar 

作用不大不小的三元运算符的,但更多的神秘和丑陋。

这只是造成对query?方法的语法糖糖尿病的情况。我想我们必须学会忍受它。

+0

+ 1为隐晦++和丑++。 – pilcrow 2010-07-13 14:17:55

+0

+1,因为这对Ruby来说更自然。你的三元运算符是一种可以说更加神秘的创新,而使用&&和||反对表达式是合乎逻辑的,因为我们知道Ruby表达式总是返回值,因此代码就是它的意思。 – exiquio 2013-04-29 01:23:06

11

为什么需要在C条件运算符的原因,是因为条件语句,以及,一个声明,即它不会(也不能)返回一个值。所以,如果你想从条件代码中返回一个值,那你的运气不好。这就是为什么必须添加条件运算符的原因:它是一个表达式,即它返回一个值。

在Ruby中,但是,因为没有报表中的Ruby反正有条件的经营者完全是多余的。 全部是一个表达式。具体来说,Ruby中没有if语句,只有if表达式。

而且由于if是一种表达,无论如何,你可以用它代替了神秘的条件运算符:

some_method(if x.predicate? then foo else bar end) 

你要记住的唯一的事情是,谓词需要通过任何一个换行符结束,分号或then。所以,你做第一个三次,你会变成

if cond 
    foo 
else 
    bar 
end 

if cond foo else bar end 

,不知为什么它不工作。但在那之后,该then(或分号)自然会到来:

if cond; foo else bar end 
if cond then foo else bar end 
+3

我upvoted,但真的吗?神秘?我不认为任何程序员会发现条件运算符是神秘的,而且我个人更希望在方法调用中看到“如果条件结束”。 – 2010-07-12 20:01:57

+0

+1代表'then' /';'对话务员的评论和讨论。 – pilcrow 2010-07-13 14:16:00

+0

+1,因为我认为这比“谓词?”更具可读性。实施 – 2011-07-27 21:24:42

3

只要删除空间。

some_method(x.predicate?? foo : bar) 

在Ruby中同样有效。尝试一下!

+3

+1我不喜欢它 - 看起来太像错字的线 - 但它是一个可行的选择。 (有趣的是,如果你通过后空翻来定义一个方法'predicate?'[原文如此,Ruby仍然会将上述内容解析为调用'谓词?'。) – pilcrow 2012-05-16 13:33:48

1

不能说这是比较容易的,但在许多情况下,它可能是有用的来包装自己谓词放在括号中,类似这样的:

some_method((x.predicate?) ? foo : bar) 

有帮助,尤其是当你的谓词并不象method?那样简单