【问题标题】:Merge 2 ternary operator statements合并 2 个三元运算符语句
【发布时间】:2024-04-25 10:20:02
【问题描述】:

假设我有以下陈述:

@string += @a == @b ? "X" : "Y"
@counter += @a == @b ? 1 : -1

是否可以将语句合并为一行?

(我已经用Ruby标记了这个问题,但我也对其他语言的三元运算符感兴趣。我想学习一些codegolf的技巧)

【问题讨论】:

  • 如果您对这些语言的解决方案感兴趣,我建议您也使用其他语言(如 python 或 perl)标记问题。

标签: java python ruby ternary-operator


【解决方案1】:

如果你在打高尔夫球,你可以使用这个:

counter+=a==b ?string<<?X&&1:string<<?Y&&-1

有点解释,因为它有点难以阅读:

string<<?X&&1

展开这个样子

string << ?X && 1

其中?X 是字符literal 表示法:

还有一种字符文字表示法来表示单个字符串,其语法是问号 (?) 后跟一个字符或转义序列,对应于脚本编码中的单个代码点

您也可以在这里使用“普通”字符串string &lt;&lt; 'X',但这是一个更长的字符,而高尔夫就是短的。

&lt;&lt; 只是将字符串连接到位。你不能在那里使用+=,因为它的优先级低于&amp;&amp;,所以Ruby认为它会是

string += (?X && 1)

抛出TypeError: no implicit conversion of Integer into String

那么,该行的其余部分只是返回 1 的布尔值 &amp;&amp; 运算符:

'some string' && 1 # => 1

因此,如果您输入三元的那部分,则连接字符串,然后“返回”1 以获得counter +=。三元的另一半与不相等的值相同。

【讨论】:

    【解决方案2】:

    假设我有以下陈述:

    Nitpick:那些不是陈述。它们是表达式。在 Ruby 中,一切都是表达式,没有语句。

    @string += @a == @b ? "X" : "Y"
    @counter += @a == @b ? 1 : -1
    

    是否可以将语句合并为一行?

    是的!在 Ruby 中,总是可以将所有内容写在一行上,而从不需要换行:

    @string += @a == @b ? "X" : "Y"; @counter += @a == @b ? 1 : -1
    

    基本上有三种情况:

    用于格式化的换行符

    如果换行符仅用于格式化,则可以将其删除:

    a + 
    b
    
    # same as:
    a + b
    
    
    def foo(a, b)
      a + b
    end
    
    # same as:
    def foo(a, b) a + b end
    

    换行符作为表达式分隔符

    如果换行符用作表达式分隔符,它可以替换为不同的表达式分隔符,例如;:

    foo()
    bar()
    
    # same as:
    foo(); bar()
    
    
    def bar
      'Hello'
    end
    
    # same as:
    def bar; 'Hello' end
    

    换行符作为复合表达式中的表达式分隔符

    这是上面的一个特例。在复合表达式中,除了分号作为表达式分隔符外,还有一些关键字可以代替:

    if foo
      bar
    else
      baz
    end
    
    # same as:
    if foo then bar else baz end
    # or:
    if foo; bar else baz end
    
    
    case foo
    when bar
      baz
    when qux
      frob
    end
    
    # same as:
    case foo when bar then baz when qux then frob end
    # or:
    case foo when bar; baz when qux; frob end
    
    
    while foo
      bar
    end
    
    # same as:
    while foo do bar end
    # or:
    while foo; bar end
    

    等等。

    这是一种特殊情况:

    def bar
      'Hello'
    end
    
    # same as:
    def bar() 'Hello' end
    # the parentheses are needed to Ruby knows where the parameter list ends
    

    【讨论】: