5

运行以下代码,

a = [1, 2, 3, 4, 5]
head, *tail = a
p head
p tail

你会得到结果

1
[2, 3, 4, 5]

谁能帮我解释一下声明head,*tail = a,谢谢!

4

3 回答 3

16

head, *tail = a表示将数组的第一个元素分配ahead,并将其余元素分配给tail

*,有时称为“splat 运算符”,它对数组执行许多操作。当它位于赋值运算符 ( ) 的左侧时=,如您的示例所示,它的意思是“把剩下的所有东西都拿走”。

如果您省略了该代码中的 splat,它将改为:

head, tail = [1, 2, 3, 4, 5]
p head # => 1
p tail # => 2

但是,当您添加 splat 时,tail它的意思是“所有未分配给先前变量 ( head) 的东西,都分配给tail。”

于 2010-09-01T13:49:07.910 回答
8

首先,它是一个并行任务。在红宝石中你可以写

a,b = 1,2

a 为 1,b 为 2。您也可以使用

a,b = b,a

交换值(没有其他语言所需的典型临时变量)。

星 * 是打包/解包操作符。写作

a,b = [1,2,3]

将 1 分配给 a,将 2 分配给 b。通过使用星号,值 2,3 被打包到一个数组中并分配给 b:

a,*b = [1,2,3]
于 2010-09-01T13:57:08.610 回答
0

我根本不了解 Ruby,但我的猜测是该语句将列表a拆分为头部(第一个元素)和其余部分(另一个列表),将新值分配给变量headtail.

这种机制通常(至少在 Erlang 中)称为模式匹配

于 2010-09-01T13:50:19.013 回答