这在Ruby语言中意味着什么?

时间:2010-09-01 13:43:32

标签: ruby splat

运行以下代码

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

您将获得结果

1
[2, 3, 4, 5]

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

3 个答案:

答案 0 :(得分:16)

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

*,有时称为“splat运算符”,它使用数组做了很多事情。当它位于赋值运算符(=)的左侧时,就像在您的示例中一样,它只是意味着“将所有内容都留下来。”

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

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

但是,当您向tail添加splat时,它表示“未将所有内容分配给先前的变量(head)”,请分配给tail。“

答案 1 :(得分:8)

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

a,b = 1,2

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

a,b = b,a

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

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

a,b = [1,2,3]

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

a,*b = [1,2,3]

答案 2 :(得分:0)

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

这种机制通常被称为(至少在Erlang中)为pattern matching