条件运算符(?:)在Ruby中使用?
例如,这是正确的吗?
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
条件运算符(?:)在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,除了优先级问题。两者都是表达式。
例子:
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会感到困惑,因为它认为它是在if 1后面加上一些额外的垃圾),但在最后一种情况下,圆括号不是必需的,因为没有出现上述问题。
你可以在多行中使用"long-if"形式来提高可读性:
question = if question.size > 20 then
question.slice(0, 20) + "..."
else
question
end
其他回答
它是三元操作符,它的工作方式类似于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会感到困惑,因为它认为它是在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"
@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
%>
我们可以很容易地说,问题严重影响了可读性。问题。
您使用ERB表明您使用的是Rails。如果是这样,那么考虑truncate,一个内置的帮助器,它将为你做这项工作:
<% question = truncate(question, :length=>30) %>
一个简单的例子,操作员检查玩家的id是否为1,并根据结果设置敌人id
player_id=1
....
player_id==1? enemy_id=2 : enemy_id=1
# => enemy=2
我发现了一个关于这个话题的帖子,看起来很有帮助。