Что это значит на языке Ruby? - PullRequest
5 голосов
/ 01 сентября 2010

Запустите следующий код,

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

Вы получите результат

1
[2, 3, 4, 5]

Кто может помочь мне объяснить утверждение head,*tail = a, Спасибо!

Ответы [ 3 ]

16 голосов
/ 01 сентября 2010

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

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

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

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

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

8 голосов
/ 01 сентября 2010

Во-первых, это параллельное назначение.В 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 голосов
/ 01 сентября 2010

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

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

...