了解范围和数组中的 ruby splat
Posted
技术标签:
【中文标题】了解范围和数组中的 ruby splat【英文标题】:Understanding ruby splat in ranges and arrays 【发布时间】:2011-11-25 07:44:16 【问题描述】:我试图了解*(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"...]
我猜部分问题在于操作员的偏好?但我不确定发生了什么。为什么我不能使用*(1..9)
和我可以使用[*1..9]
一样?
【问题讨论】:
p *(1..9).map|a| a.to_s
工作正常
同样,([*1..9]).map
应该可以正常工作;但是,我认为显式的to_a
方法更清晰,本质上也一样简洁。
【参考方案1】:
我认为问题在于 splat 只能用作左值,即它必须被某些东西接收。
因此,您的 *(1..9).map
示例失败,因为没有接收者 splat,但 [*1..9].map
有效,因为您正在创建的数组是 splat 的接收者。
更新: 有关此线程的更多信息(尤其是最后一条评论):Where is it legal to use ruby splat operator?
【讨论】:
以上是关于了解范围和数组中的 ruby splat的主要内容,如果未能解决你的问题,请参考以下文章
为啥带有 splat 参数的 Ruby 过程/块的行为与方法和 lambda 不同?