条件运算符(?:)在Ruby中使用?

例如,这是正确的吗?

<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>

当前回答

简单的方法:

param_a = 1
param_b = 2

result = param_a === param_b ? 'Same!' : 'Not same!'

因为param_a不等于param_b,那么结果的值将不相同!

其他回答

您使用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
%>

我们可以很容易地说,问题严重影响了可读性。问题。

代码条件?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,那么结果的值将不相同!

puts true ? "true" : "false"
=> "true"


puts false ? "true" : "false"
=> "false"