如何在Ruby中使用条件运算符(? :
)?
例如,这是正确的吗?
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
它是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
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会引发错误,但您可以在行尾使用\
行继续符号,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
的严重影响。
一个简单的例子,操作员检查玩家的id是否为1并根据结果设置敌人id
player_id=1
....
player_id==1? enemy_id=2 : enemy_id=1
# => enemy=2
我找到了一个关于这个话题的post,看起来很有帮助。
代码condition ? statement_A : statement_B
相当于
if condition == true
statement_A
else
statement_B
end