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

How do I use the conditional operator (? :) in Ruby?

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

例如,这是正确的吗?

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


它是三元运算符,工作方式类似于C(不需要括号)。这是一个表达式,其工作方式如下:

1
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,除了优先级问题。两者都是表达式。

实例:

1
2
3
4
5
6
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"格式在多行上进行可读性:

1
2
3
4
5
question = if question.size > 20 then
  question.slice(0, 20) +"..."
else
  question
end


1
2
3
4
5
6
puts true ?"true" :"false"
=>"true"


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


你对erb的使用表明你在铁轨上。如果是这样的话,那么考虑一下truncate,它是一个内置的助手,可以为您完成工作:

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


@pst给出了一个很好的答案,但我想说的是,在Ruby中,三元运算符被写在一行上,以确保语法正确,而不像perl和c那样,我们可以将它写在多行上:

1
(true) ? 1 : 0

通常,如果您试图将Ruby拆分为多行,Ruby会出错,但是您可以在行的末尾使用\行继续符号,Ruby会很高兴:

1
2
3
(true)   \
  ? 1    \
  : 0

这是一个简单的例子,但是它在处理较长的行时非常有用,因为它可以很好地安排代码。

通过将运算符放在行的最后,也可以使用不带行连续字符的三元,但我不喜欢或建议这样做:

1
2
3
(true) ?
  1 :
  0

我认为随着条件测试和/或结果变长,这会导致代码非常难以读取。

我读过一些评论说不要使用三元运算符,因为它很混乱,但这是不使用某个东西的一个坏理由。同样的逻辑,我们不应该使用正则表达式、范围运算符(..和看似未知的"触发器"变化)。它们在正确使用时很强大,所以我们应该学会正确使用它们。

Why have you put brackets around true?

考虑OP的例子:

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

包装条件测试有助于提高可读性,因为它可以直观地分隔测试:

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

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

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

或者,更习惯地说:

1
2
3
4
5
6
<% question = if (question.size > 20)
                question.question.slice(0, 20) +"..."
              else
                question.question
              end
%>

很容易说,question.question也严重影响了可读性。


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

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

我找到了一篇关于这个主题的文章,这似乎很有帮助。


代码condition ? statement_A : statement_B相当于

1
2
3
4
5
if condition == true
  statement_A
else
  statement_B
end