ruby idiom:谓词和条件运算符

pil*_*row 6 ruby predicate ternary-operator conditional-operator

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

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

some_method( x.predicate? ? foo : bar )
Run Code Online (Sandbox Code Playgroud)

这两个问号彼此如此接近,我感到震惊.是否存在等效的紧凑且可读的替代方案?

Jör*_*tag 12

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

然而,在Ruby中,条件运算符完全是多余的,因为无论如何Ruby都没有语句.一切都是表达.具体来说,ifRuby中没有语句,只有一个if表达式.

而且既然if是表达式,你可以使用它而不是神秘的条件运算符:

some_method( if x.predicate? then foo else bar end )
Run Code Online (Sandbox Code Playgroud)

你唯一需要记住的是谓词需要用换行符,分号或者分号来终止then.所以,你做这个的前三次,你会转

if cond
  foo
else
  bar
end
Run Code Online (Sandbox Code Playgroud)

if cond foo else bar end
Run Code Online (Sandbox Code Playgroud)

并想知道为什么它不起作用.但在那之后,then(或分号)将自然而然地出现:

if cond; foo else bar end
if cond then foo else bar end
Run Code Online (Sandbox Code Playgroud)

  • 我赞成了,但是真的吗?神秘?我认为任何程序员都不会觉得条件运算符含糊不清,而且我个人更愿意看到,而不是在方法调用中"if conditon foo else bar end". (3认同)

Chu*_*bas 9

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

x.predicate? && foo || bar
Run Code Online (Sandbox Code Playgroud)

它有点像三元运算符,但更加神秘和丑陋.

这只是由query?方法上的糖引起的语法糖尿病的情况.我想我们只需要学会忍受它.