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

时间:2010-11-23 05:02:23

标签: ruby ternary-operator conditional-operator

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

例如,这是正确的吗?

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

7 个答案:

答案 0 :(得分:461)

它是ternary operator,它在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,除了优先级问题。两者都是表达。

示例:

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

答案 1 :(得分:31)

puts true ? "true" : "false"
=> "true"


puts false ? "true" : "false"
=> "false"

答案 2 :(得分:25)

您对ERB的使用表明您在Rails中。如果是这样,那么考虑truncate,一个内置帮助器,它将为您完成任务:

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

答案 3 :(得分:17)

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

(true) ? 1 : 0

正常情况下,如果您尝试将其拆分为多行,Ruby会引发错误,但您可以在行尾使用\行继续符号,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的严重影响。

答案 4 :(得分:3)

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

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

我发现post关于这个话题似乎非常有帮助。

答案 5 :(得分:0)

代码condition ? statement_A : statement_B等效于

if condition == true
  statement_A
else
  statement_B
end

答案 6 :(得分:0)

最简单的方法:

param_a = 1
param_b = 2

result = param_a === param_b ? 'Same!' : 'Not same!'

由于param_a不等于param_b,因此result的值为Not same!