我们说我有以下陈述:
@string += @a == @b ? "X" : "Y"
@counter += @a == @b ? 1 : -1
是否可以将语句合并为一行?
(我用Ruby标记了这个问题,但我也对其他语言的三元运算符感兴趣。我想学习一些codegolf的技巧)
答案 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
如果换行符用作表达式分隔符,则可以用不同的表达式分隔符替换它,例如;
:
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