运行以下代码,
a = [1, 2, 3, 4, 5]
head, *tail = a
p head
p tail
你会得到结果
1
[2, 3, 4, 5]
谁能帮我解释一下声明head,*tail = a
,谢谢!
head, *tail = a
表示将数组的第一个元素分配a
给head
,并将其余元素分配给tail
。
*
,有时称为“splat 运算符”,它对数组执行许多操作。当它位于赋值运算符 ( ) 的左侧时=
,如您的示例所示,它的意思是“把剩下的所有东西都拿走”。
如果您省略了该代码中的 splat,它将改为:
head, tail = [1, 2, 3, 4, 5]
p head # => 1
p tail # => 2
但是,当您添加 splat 时,tail
它的意思是“所有未分配给先前变量 ( head
) 的东西,都分配给tail
。”
首先,它是一个并行任务。在红宝石中你可以写
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]
我根本不了解 Ruby,但我的猜测是该语句将列表a
拆分为头部(第一个元素)和其余部分(另一个列表),将新值分配给变量head
和tail
.
这种机制通常(至少在 Erlang 中)称为模式匹配。