我想测试并行分配的返回值,然后编写puts (x, y = 1, 2)
,但它不起作用,并输出错误消息:
SyntaxError: (irb):74: syntax error, unexpected ',', expecting ')'
puts (x,y =1,2)
^
(irb):74: syntax error, unexpected ')', expecting end-of-input
有什么不对的吗?
你有两个问题。
puts
和之间的空格(
可防止括号列表被解释为参数列表。在方法名称后放置空格后,任何参数列表都必须在括号之外,并且所有带括号的部分都必须是合法的表达式。在Ruby中,(x,y,z)
它不是合法的单个表达式,因此会出现上述错误。
如果删除空间,则会得到以下信息:
> puts(x, y = 1, 2)
NameError: undefined local variable or method `x' for main:Object
那是因为你的第二个问题:
该语句puts(x,y = 1,2)
被解析为puts(x, y=1, 2)
; 也就是说,Ruby将其解释为将三个参数传递给puts
:x
第一个,y=1
第二个和2
第三个参数。由于x
不在分配的左侧,并且尚未定义,因此会出现上述错误。
使用额外的一组括号将整个分配作为一个参数分组在一起:
> puts((x,y=1,2))
1
2
但是请注意,这将传递包含两个项目的单个列表。它与并没有区别puts
,但是对于区分列表和单个参数的方法而言:
> def foo(a,b) puts "a=#{a},b=#{b}" end
> foo((x,y=1,2))
ArgumentError: wrong number of arguments (1 for 2)
因此,在这种情况下,您还需要标点符号-splat运算符:
> foo(*(x,y=1,2))
a=1, b=2
有趣的是,但实际上没有实际意义的是,一旦将括号加倍,就可以根据需要放回空格:
> puts ((x, y = 1, 2))
1
2
但是同样,这又使它们从参数包装器变成了一个额外的表达式包装器。您可以在其周围加上任意数量的括号,而无需进行任何更改。这意味着,在这种foo
情况下,splat运算符必须走在两组括号之外:
> foo (*(x,y=1,2))
SyntaxError: (irb):24: syntax error, unexpected tSTAR
> foo *((x,y=1,2))
a=1, b=2
但是,在第一个参数本身包含括号的情况下,在Ruby中通常认为使用无括号形式是不好的样式。根据您的Ruby版本,您可能会收到有关此类语句的警告,但是即使您没有这样做,也最好使用完全括号化的版本(方法名称后没有空格)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句