Глядя на этот учебник CoffeeScript: http://jashkenas.github.com/coffee-script/
Я не совсем понимаю, для чего предназначены Splats. Что это за конструкция? Откуда он (исторически)
Глядя на этот учебник CoffeeScript: http://jashkenas.github.com/coffee-script/
Я не совсем понимаю, для чего предназначены Splats. Что это за конструкция? Откуда он (исторически)
Термин "оператор 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), значки являются огромной экономией времени для работы с различным количеством аргументов.
если вы знаете python, args...
примерно похож на *args
, так как он позволяет обрабатывать параметры функции в виде списка
например:
concat = (args...) -> args.join(', ')
concat('hello', 'world') == 'hello, world'
concat('ready', 'set', 'go!') == 'ready, set, go!'
он также работает в настройках:
[first, rest...] = [1, 2, 3, 4]
first == 1
rest == [2, 3, 4]
Splats - это термин для использования оператора ...
для var-args (функции, которые принимают переменное количество аргументов).
Я думаю, что это синтаксический сахар для объекта аргументов javascript.
Идея может возникнуть из ruby оператора splat *
.