3

考虑这段代码:

values = ["one", "two", "", "four"]

values.each do |value|
puts value.empty? ? "emptyness" : "#{value} is #{value.length}"
end

在 Ruby 1.8.7 中是否可以格式化缩进操作数的三元运算符?就像是:

puts value.empty?
    ? "emptyness" 
    : "#{value} is #{value.length}"

但这显然行不通。

4

3 回答 3

6

使用 Ruby 本身没有转义的方法是让 Ruby 知道它正在等待更多信息

puts value.empty?  ?
  "emptyness" :
  "#{value} is #{value.length}"

这样做的原因是 Ruby 看到了三元组的部分,并且知道需要更多的东西来完成语句。

在 OP 的代码中使用括号不起作用,语句仍然是部分的,并且 Ruby 不知道如何处理 ? 和 : 在下一行。

当然,你并不真的需要三元:

values = ["one", "two", "", "four"]

values.each do |value|
  puts value.empty? && "emptyness" ||
    "#{value} is #{value.length}"
end
于 2013-05-12T20:09:34.400 回答
5

您可以使用该字符\将命令拆分为换行符。

这将起作用:

values = ["one", "two", "", "four"]

values.each do |value|
   puts value.empty? \
     ? "emptyness" \
     : "#{value} is #{value.length}"
end

此外,字符后不能有任何空格,\否则会引发语法错误。

于 2013-05-12T19:59:01.170 回答
2

当三元运算符需要拆分为多行时,可能是时候改用if了:

puts if value.empty?
       "emptyness"
     else
       "#{value} is #{value.length}"
     end

这是有效的,因为if与 Ruby 中的任何其他表达式一样,都有结果。该结果是thenelse部分的结果,以执行的为准(如果条件为假且没有else部分,则if的结果为零)。

于 2013-05-12T21:00:25.930 回答