head, *tail = a
означает присвоить первому элементу массива a
значение head
, а остальным элементам - tail
.
*
, иногда называемый «оператором сплат», выполняет множество операций с массивами. Когда он находится с левой стороны от оператора присваивания (=
), как в вашем примере, это просто означает «все перенести».
Если вы опустите знак восклицательного знака в этом коде, он сделает это вместо этого:
head, tail = [1, 2, 3, 4, 5]
p head # => 1
p tail # => 2
Но когда вы добавляете сплат к tail
, это означает «Все, что не было присвоено предыдущим переменным (head
), присваиваете tail
».