? :
在Ruby中如何使用条件运算符()?
例如,这是正确的吗?
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
? :
在Ruby中如何使用条件运算符()?
例如,这是正确的吗?
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
Answers:
它是三元运算符,其工作方式类似于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
nil
和false
。确实不是很平常。
puts true ? "true" : "false"
=> "true"
puts false ? "true" : "false"
=> "false"
puts (true ? "true" : "false")
带有括号的小修改。否则,操作顺序不清楚。当我初次阅读此内容时,我很困惑,因为我 (puts true) ? "true" : "false"
希望随后puts
返回布尔值,然后该布尔值成为字符串值。
@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
也会受到严重影响。
true
?
true
实际上是坐在什么地方,所以它的计算结果就是true
或false
。最好以视觉方式对这些进行定界,因为三元语句会迅速演变为视觉噪声,从而降低影响可维护性的可读性。
一个简单的示例,其中操作员检查玩家的ID是否为1,并根据结果设置敌人ID
player_id=1
....
player_id==1? enemy_id=2 : enemy_id=1
# => enemy=2
我找到了有关该主题的帖子,似乎很有帮助。
enemy_id = player_id == 1 ? 2 : 1
呢?
该代码condition ? statement_A : statement_B
等效于
if condition == true
statement_A
else
statement_B
end
最简单的方法:
param_a = 1
param_b = 2
result = param_a === param_b ? 'Same!' : 'Not same!'
由于param_a
不等于,param_b
则result
的值为Not same!
question=question[0,20]
如果它小于20,则不会对其进行任何更改。