Ответ 1
Термин "оператор splat" происходит от Ruby, где символ *
(иногда называемый "splat" -see запись файла Jargon) используется для указания, что запись в списке аргументов должна "впитывать" список аргументов.
CoffeeScript очень быстро использовал значки в стиле Ruby (см. issue 16), но по предложению Дугласа Крокфорда синтаксис был изменен с *x
до x...
через пару недель (см. проблема 45). Тем не менее, CoffeeScript все еще ссылаются на синтаксис как на "splat" или "splat operator".
Что касается того, что они на самом деле делают, то значки разбивают объект arguments
таким образом, что разделенный аргумент становится массивом всех "лишних" аргументов. Самый тривиальный пример:
(args...) ->
В этом случае args
будет просто копией массива arguments
. Разнесенные аргументы могут появляться либо до, после, либо между стандартными аргументами:
(first, rest...) ->
(rest..., last) ->
(first, rest..., last) ->
В первых двух случаях, если функция получает аргументы 0-1, rest
будет пустым массивом. В последнем случае функция должна принимать более 2 аргументов для rest
, чтобы быть непустой.
Так как JavaScript не допускает множественные подписи для функций с тем же именем (как это делают C и Java), значки являются огромной экономией времени для работы с различным количеством аргументов.