6

我喜欢明智地使用三元条件运算符。在我看来,它非常简洁。

但是,在 ruby​​ 中,我发现我经常测试谓词方法,它们已经有自己的问号:

some_method( x.predicate? ? foo : bar )

这两个问号如此接近,让我感到震惊。是否有同等紧凑和可读的替代方案?

4

4 回答 4

12

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
于 2010-07-12T19:47:01.580 回答
9

你能得到的最简洁的表达是

x.predicate? && foo || bar

它的作用类似于三元运算符,但更加神秘和丑陋。

这只是方法上的糖引起的句法糖尿病query?。我想我们只需要学会忍受它。

于 2010-07-12T19:58:14.333 回答
3

只需删除空间。

some_method( x.predicate?? foo : bar )

在 Ruby 中同样有效。试试看!

于 2012-05-16T00:09:51.890 回答
1

不能说它更容易,但在许多情况下,将谓词本身包装到括号中可能很有用,如下所示:

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

它有帮助,尤其是当您的谓词不像method?

于 2016-03-16T15:26:09.057 回答