Выполните следующий код,Что это значит на языке 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
,
Этот механизм обычно упоминается (по крайней мере, в Эрланге) как pattern matching.
Во-первых, это параллельное назначение. В рубина вы можете написать
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]
хороший ответ! :), но вы действительно должны изменить свой профиль pic, вы выглядите как чересчур ухоженный пудель;) hehe – horseyguy
Ха-ха. Раньше у меня этого не было. Я возьму его под советом. :) –
@ banner: Его текущий pic (возможно, не тот, который использовался тогда) заставляет его выглядеть как Джастин Бибер! –