我喜欢明智地使用三元条件运算符。在我看来,它非常简洁。
但是,在 ruby 中,我发现我经常测试谓词方法,它们已经有自己的问号:
some_method( x.predicate? ? foo : bar )
这两个问号如此接近,让我感到震惊。是否有同等紧凑和可读的替代方案?
我喜欢明智地使用三元条件运算符。在我看来,它非常简洁。
但是,在 ruby 中,我发现我经常测试谓词方法,它们已经有自己的问号:
some_method( x.predicate? ? foo : bar )
这两个问号如此接近,让我感到震惊。是否有同等紧凑和可读的替代方案?
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
你能得到的最简洁的表达是
x.predicate? && foo || bar
它的作用类似于三元运算符,但更加神秘和丑陋。
这只是方法上的糖引起的句法糖尿病query?
。我想我们只需要学会忍受它。
只需删除空间。
some_method( x.predicate?? foo : bar )
在 Ruby 中同样有效。试试看!
不能说它更容易,但在许多情况下,将谓词本身包装到括号中可能很有用,如下所示:
some_method((x.predicate?) ? foo : bar )
它有帮助,尤其是当您的谓词不像method?