2011-09-26 68 views
8

我想了解*(1..9)[*1..9]了解红宝石图示

之间的区别,如果我把它们分配给变量,他们的工作方式相同

splat1 = *(1..9) # splat1 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
splat2 = [*1..9] # splat2 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 

但事情变得奇怪,当我尝试直接使用*(1..9)[*1..9]

*(1..9).map{|a| a.to_s} # syntax error, unexpected '\n', expecting tCOLON2 or '[' or '.' 
[*1..9].map{|a| a.to_s} # ["1", "2", "3"...] 

我猜是问题的一部分是与运营商precidence?但我不确定发生了什么事。为什么我无法使用*(1..9)我可以使用[*1..9]

+1

'P *(1..9){.MAP | A | a.to_s}'工作正常 – Bohdan

+0

同样,'([* 1..9])map'应该做工精细。不过,我认为明确的'to_a'方法更加清晰,基本上同样简洁。 – maerics

回答

8

我认为问题在于splat只能用作左值,也就是说它必须被某种东西接收。

因此,您的示例*(1..9).map失败,因为没有收件人splat,但[*1..9].map工作,因为您创建的数组是splat的收件人。

UPDATE: 在此线程(尤其是最后评论)的一些详细信息:Where is it legal to use ruby splat operator?