运行以下代码:
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
。
*
,有时被称为“展开运算符”,在处理数组时可以做很多事情。当它位于赋值操作符(=
)的左侧时,就像你的示例一样,它只是表示“取出所有剩余的元素”。
如果你省略了这段代码中的展开运算符,则会执行以下操作:
head, tail = [1, 2, 3, 4, 5]
p head # => 1
p tail # => 2
但是,当你在tail
中添加星号时,它的意思是“将没有被分配给前面变量(head
)的所有内容,分配给tail
”。
首先,这是一个并行赋值。在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]
我完全不了解 Ruby,但我的猜测是该语句将列表 a
分成头部(第一个元素)和其余部分(另一个列表),并将新值分配给变量 head
和 tail
。
这种机制通常被称为模式匹配(至少在 Erlang 中是这样)。