了解范围和数组中的 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的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 中的关键字参数解包(splat)

Ruby,Splat 的源代码?

为啥带有 splat 参数的 Ruby 过程/块的行为与方法和 lambda 不同?

如何从文件中将文本读入ruby中的数组

Haskell 有像 Python 和 Ruby 这样的 splat 运算符吗?

Double-splat 运算符破坏性地修改了哈希——这是一个 Ruby 错误吗?