这在Ruby语言中是什么意思?

5

运行以下代码:

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

你将会得到结果。
1
[2, 3, 4, 5]

谁可以帮我解释这个语句head,*tail = a的含义,谢谢!
3个回答

16

head, *tail = a 的意思是将数组 a 的第一个元素赋值给 head,并将剩下的元素赋值给 tail

*,有时被称为“展开运算符”,在处理数组时可以做很多事情。当它位于赋值操作符(=)的左侧时,就像你的示例一样,它只是表示“取出所有剩余的元素”。

如果你省略了这段代码中的展开运算符,则会执行以下操作:

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

但是,当你在tail中添加星号时,它的意思是“将没有被分配给前面变量(head)的所有内容,分配给tail”。


好答案! :) 但你真的应该换一张头像,你看起来像一只过度修剪的贵宾犬 ;) 嘿嘿 - horseyguy
哈哈,我以前没有听过这个。我会考虑一下的。 :) - Jordan Running
@banister:他现在的照片(也许不是当时用的那张)让他看起来像贾斯汀·比伯! - Andrew Grimm

8

首先,这是一个并行赋值。在Ruby中,您可以编写以下代码:

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]

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接