如何在Ruby中使用条件运算符(?:)?

Ruby中使用的条件运算符( ? : :)如何?

例如,这是正确的吗?

 <% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %> 

它是三元运算符 ,它和C一样工作(不需要括号)。 这是一个表达式,其工作原理如下:

 if_this_is_a_true_value ? then_the_result_is_this : else_it_is_this 

但是,在Ruby中, if也是这样的表达式: if a then b else c end === a ? b : c a ? b : c ,除了优先权问题。 两者都是表达式。

例子:

 puts (if 1 then 2 else 3 end) # => 2 puts 1 ? 2 : 3 # => 2 x = if 1 then 2 else 3 end puts x # => 2 

请注意,在第一种情况下,括号是必需的(否则Ruby是困惑的,因为它认为它是puts if 1后面有一些额外的垃圾),但是在最后一种情况下它们不是必需的,因为所述问题没有出现。

您可以在多行上使用“long-if”格式来提高可读性:

 question = if question.size > 20 then question.slice(0, 20) + "..." else question end 
 puts true ? "true" : "false" => "true" puts false ? "true" : "false" => "false" 

你使用ERB表明你在Rails中。 如果是这样,那么考虑truncate ,一个内置的帮手,将为你做的工作:

 <% question = truncate(question, :length=>30) %> 

@pst给出了一个很好的答案,但是我想提一下,在Ruby中,三元运算符被写在一行上,在语法上是正确的,与Perl和C不同的是,我们可以把它写在多行上:

 (true) ? 1 : 0 

通常情况下,如果您尝试将其分割成多行,Ruby会引发错误,但是可以在行尾使用\ line-continuation符号,Ruby会很高兴:

 (true) \ ? 1 \ : 0 

这是一个简单的例子,但是在处理较长的行时它会非常有用,因为它能够很好地布置代码。

也可以通过把操作符放在最后一行来使用没有连续字符的三元组,但我不喜欢或推荐它:

 (true) ? 1 : 0 

我认为这会导致很难阅读代码,因为条件测试和/或结果会变得更长。

我读过评论说不使用三元运算符,因为它是混乱,但这是一个不使用的东西坏的理由。 通过同样的逻辑,我们不应该使用正则表达式,范围运算符(' .. '和看似未知的“触发器”变体)。 使用正确的话,它们功能强大,所以我们应该学会正确使用它们。


你为什么把括号放在true

考虑OP的例子:

 <% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %> 

包装条件测试有助于使其更具可读性,因为它在视觉上将测试分开:

 <% question = (question.size > 20) ? question.question.slice(0, 20)+"..." : question.question %> 

当然,通过使用一些明智的空白添加,整个示例可以变得更加可读。 这是未经测试,但你会得到这个想法:

 <% question = (question.size > 20) ? question.question.slice(0, 20) + "..." \ : question.question %> 

或者更多地写作:

 <% question = if (question.size > 20) question.question.slice(0, 20) + "..." else question.question end %> 

question.question可读性受到严重question.question也是容易的。

一个简单的例子,操作员检查玩家的ID是否为1,并根据结果设置敌方ID

 player_id=1 .... player_id==1? enemy_id=2 : enemy_id=1 # => enemy=2 

我发现了一个关于这个话题的帖子 ,这似乎很有帮助。

这是一个小的变化是使用转换为布尔值! 这样的运营商

 result = !!(condition == true)