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中,
实例:
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会混淆,因为它认为它是
您可以使用"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的使用表明你在铁轨上。如果是这样的话,那么考虑一下
1 | <% question = truncate(question, :length=>30) %> |
@pst给出了一个很好的答案,但我想说的是,在Ruby中,三元运算符被写在一行上,以确保语法正确,而不像perl和c那样,我们可以将它写在多行上:
1 | (true) ? 1 : 0 |
通常,如果您试图将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 %> |
很容易说,
一个简单的例子,操作员检查玩家的ID是否为1,并根据结果设置敌人的ID。
1 2 3 4 | player_id=1 .... player_id==1? enemy_id=2 : enemy_id=1 # => enemy=2 |
我找到了一篇关于这个主题的文章,这似乎很有帮助。
代码
1 2 3 4 5 | if condition == true statement_A else statement_B end |