合并2个三元运算符语句

时间:2017-08-25 22:49:18

标签: java python ruby ternary-operator

我们说我有以下陈述:

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

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

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

2 个答案:

答案 0 :(得分:3)

如果您打高尔夫球,可以使用:

counter+=a==b ?string<<?X&&1:string<<?Y&&-1
有点解释,因为它有点难以理解:

string<<?X&&1

展开这看起来像

string << ?X && 1

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

  

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

您也可以使用&#34;普通&#34;在这里使用string << 'X'字符串,但这个字符更长,高尔夫就是短暂的。

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

string += (?X && 1)

抛出TypeError: no implicit conversion of Integer into String

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

'some string' && 1 # => 1

因此,如果您输入三元组的那一部分,则连接字符串,然后返回&#39; 1的{​​{1}}。三元的另一半是相同的,不相等的值。

答案 1 :(得分:1)

  

假设我有以下陈述:

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

Newline as expression separator

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

foo()
bar()

# same as:
foo(); bar()


def bar
  'Hello'
end

# same as:
def bar; 'Hello' end

Newline作为复合表达式

中的表达式分隔符

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

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