Что означает «Знаки» в учебнике CoffeeScript?

114

Глядя на это руководство по CoffeeScript: http://jashkenas.github.com/coffee-script/

Я не совсем понимаю, для чего нужны Splats. Что это за конструкция? Откуда это взялось (исторически)

Interstar
источник
И, как обычно, вы также должны знать, как это может быть реализовано в vanilla Js: arguments+ call: stackoverflow.com/questions/17380315/…
Ciro Santilli 郝海东 冠状 病 六四 事件
1
Мне нравится думать об этом как о параметре, который «разбрызгивается» (как краска) в неопределенный континуум
arviman
3
Для всех, кто любит Python: это ваш *argsвариант def foo(*args):.
maligree
1
Примечание по терминологии: ES6 принял аналогичный, но префиксный синтаксис. В ES6 получение , ...argsназывается остальными параметрами, а расширение ...argsдо литерала вызова функции / массива / объекта называется распространением
Бени Чернявский-Паскин,

Ответы:

199

Термин «оператор splat» происходит от Ruby, где *символ (иногда называемый «splat» - см. Запись в файле жаргона ) используется для обозначения того, что запись в списке аргументов должна «впитывать» список аргументов.

CoffeeScript очень рано принял splats в стиле Ruby (см. Выпуск 16 ), но по предложению Дугласа Крокфорда синтаксис был изменен с *xна x...пару недель спустя (см. Выпуск 45 ). Тем не менее, CoffeeScripters по-прежнему называют синтаксис оператором splat или splat.

Что касается того, что они на самом деле делают, splats разрезает argumentsобъект таким образом, что аргумент splatted становится массивом всех «дополнительных» аргументов. Самый тривиальный пример:

(args...) ->

В этом случае это argsбудет просто копия массива arguments. Разделенные аргументы могут быть до, после или между стандартными аргументами:

(first, rest...) ->
(rest..., last) ->
(first, rest..., last) ->

В первых двух случаях, если функция получает 0-1 аргументов, restбудет пустой массив. В последнем случае функция должна получить более двух аргументов, restчтобы быть непустой.

Поскольку JavaScript не позволяет использовать несколько подписей для функций с одним и тем же именем (как это делают C и Java), splats значительно экономят время при работе с различным количеством аргументов.

Тревор Бернхэм
источник
2
Аналогично paramsключевому слову C # .
ThatMatthew
Когда мне когда-нибудь понадобится это использовать?
Джефф Скотт Уорд,
1
когда вы не уверены в количестве параметров, которые хотите принять.
гпрасант
1
Технически известна как [вариативная функция] ( en.wikipedia.org/wiki/Variadic_function ) или функция неопределенной «арности». В большинстве языков для обозначения переменных аргументов используется какая-то форма многоточия.
Лоуренс Доль,
1
@JeffScottWard - прекрасный пример console.log, он принимает любое количество аргументов. console.log('this:',variable,'should be replaced with', another_variable);
Роб
13

если вы знаете 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]
keppla
источник
6

Знаки Splats - это термин для использования ...оператора для var-args (функций, которые принимают переменное количество аргументов).

Джефф Фостер
источник
См. Также: Python * args и ** kwargs, а также параметр rest в ActionScript 3.
Jordan
3

Я думаю, что это синтаксический сахар для объекта аргументов javascript.

Идея может прийти от оператора splat* в Ruby .

Zifei Tong
источник
технически это немного больше, поскольку его можно использовать в присваивании слева, и его можно комбинировать с именованными аргументами: in (x, rest...) ->, не restсодержит x, argumentsимеет.
keppla