【问题标题】:Using whitespace in Ruby code (the ternary operator)在 Ruby 代码中使用空格(三元运算符)
【发布时间】:2013-05-06 20:29:00
【问题描述】:

考虑这段代码:

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}"

但是这个显然行不通。

【问题讨论】:

  • 一般来说,你应该只对非常短的表达式使用三元运算符。如果您觉得需要使用多行代码,最好使用完整的 if [...] else [...] end 以使其更具可读性和明确性。
  • 如果您使用三元运算符,我不同意它应该放在一条线上。您使用的临时变量越少越好。您的代码将以从左到右的方式更具可读性,而不必再往下查找为什么要执行所有中间条件逻辑。

标签: ruby whitespace ternary-operator


【解决方案1】:

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

【讨论】:

  • 另外,OP 可以使用括号。
  • 我总是觉得这种方式不太具有表现力。以下几行是运算符的一部分并不是立即可见的,但很高兴知道。
  • 你是对的,至少问号需要在同一行(不使用转义时)。也就是说,首先将三元组拆分为多行仍然是个坏主意:)
【解决方案2】:

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

这将起作用:

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 是的,但不是问的问题。
    • @vgoff,OP 对 Ruby 语法的不熟悉表明 OP 可能不知道 Ruby 的一些更微妙的点。由于这个 - if 是一个具有值的表达式 - 导致了另一种(并且可以说是更好的)解决问题的方法,它是密切相关的。
    • 在意识到 if 语句之前询问有关三元的问题会很奇怪。我假设对带有 Ruby 语法的 OP 并不陌生,而是不熟悉表达式的终止方式。相反,询问 Ruby 关于行尾的更微妙的观点会表明他们熟悉语法。虽然我同意语法相关的观点。
    猜你喜欢
    • 2011-07-12
    • 2012-06-23
    • 2011-07-12
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 2021-07-13
    相关资源
    最近更新 更多