2010-09-01 8 views

ответ

16

head, *tail = a означает присвоение первого элемента массива a до head и присвоение остальным элементам tail.

*, иногда называемый «оператор splat», выполняет ряд операций с массивами. Когда он находится на левой стороне оператора присваивания (=), как в вашем примере, это просто означает «все остальное».

Если вы опустили восклицательный знак в этом коде, он будет делать это вместо:

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

Но когда вы добавляете восклицательный знак в tail это означает «Все, что не получил назначенное предыдущие переменные (head), назначьте tail. "

+0

хороший ответ! :), но вы действительно должны изменить свой профиль pic, вы выглядите как чересчур ухоженный пудель;) hehe – horseyguy

+0

Ха-ха. Раньше у меня этого не было. Я возьму его под советом. :) –

+0

@ banner: Его текущий pic (возможно, не тот, который использовался тогда) заставляет его выглядеть как Джастин Бибер! –

0

Я не знаю, Руби на всех, но я думаю, что заявление раскалывается список a в голову (первый элемент), а остальные (другой список), назначая новые значения переменных head и tail ,

Этот механизм обычно упоминается (по крайней мере, в Эрланге) как pattern matching.

8

Во-первых, это параллельное назначение. В рубина вы можете написать

a,b = 1,2 

и будет 1, б будет 2. Вы также можете использовать

a,b = b,a 

поменять местами значения (без типичной темп-переменной, необходимой на других языках).

Звезда * является оператором упаковки/распаковки. Письмо

a,b = [1,2,3] 

присвоит 1 а и 2 по b. Используя звезду, значения 2,3 упаковываются в массив и назначаются на b:

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