运行下面的代码,这在Ruby语言中意味着什么?
a = [1, 2, 3, 4, 5]
head, *tail = a
p head
p tail
你会得到的结果
1
[2, 3, 4, 5]
谁能帮我解释声明head,*tail = a
,谢谢!
运行下面的代码,这在Ruby语言中意味着什么?
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操作符”,它对数组做了很多事情。当它位于赋值运算符(=
)的左侧时,就像在你的例子中那样,它只是意味着“把所有的东西都留下”。
如果省略代码的图示,它会做这个:
head, tail = [1, 2, 3, 4, 5]
p head # => 1
p tail # => 2
但是,当您添加到图示它tail
的意思是“这并不会分配给前面的两个变量的一切(head
),分配给tail
。“
我不知道红宝石在所有的,但我的猜测是,该语句分裂列表a
成头(第一个元素),其余的(另一个列表),分配新值的变量head
和tail
。
这种机制通常被称为(至少在Erlang中)为pattern matching。
首先,它是一个平行分配。在Ruby中,你可以写
a,b = 1,2
和为1和B将被2.您也可以使用
a,b = b,a
交换价值(不包括在其他语言中所需要的典型临时变量)。
星*是包/解包运算符。写作
a,b = [1,2,3]
将分配1给a和2给b。通过使用星号,将值2,3打包成一个数组并分配给b:
a,*b = [1,2,3]
不错的答案! :)但你真的应该改变你的个人资料图片,你看起来像一个过分修饰的贵宾犬;)嘿嘿 – horseyguy 2010-09-01 14:12:01
哈哈。我以前没有过。我会在劝告下接受。 :) – 2010-09-01 14:29:00
@banister:他目前的照片(可能与当时使用的不一样)使他看起来像贾斯汀比伯! – 2011-09-15 02:15:58