如何在Ruby中使用条件运算符(?:)?
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
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会引发错误,但是可以在行尾使用\
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 %>
question.question
可读性受到严重question.question
也是容易的。
一个简单的例子,操作员检查玩家的ID是否为1,并根据结果设置敌方ID
player_id=1 .... player_id==1? enemy_id=2 : enemy_id=1 # => enemy=2
我发现了一个关于这个话题的帖子 ,这似乎很有帮助。
这是一个小的变化是使用转换为布尔值! 这样的运营商
result = !!(condition == true)