Що означає "Splats" у навчальному посібнику CoffeeScript?


114

Переглядаючи цей підручник для CoffeeScript: http://jashkenas.github.com/coffee-script/

Я не зовсім бачу, для чого потрібні бризки. Що це за конструкція? Звідки воно походить (історично)


І , як завжди, ви також повинні знати , як він може бути реалізований в ванільним Js: arguments+ call: stackoverflow.com/questions/17380315 / ...
Чіро Сантіллі郝海东冠状病六四事件法轮功

1
Мені подобається думати про це як про параметр, який потрапляє "забризкується" (як фарба) у невизначений континуум
arviman

3
Для всіх, хто схиляється до Python: це ваш *argsін def foo(*args):.
малігрея

1
Термінологічна примітка: ES6 прийняв подібний, але префікс синтаксис. В ES6 прийом , ...argsназивається параметрами відпочинку, а розширення ...argsу функцію виклику / масиву / об'єкта літералом називається спред
Бені Чернявський-Паскін

Відповіді:


199

Термін "оператор бризки" походить від Ruby, де *символ (іноді його називають "splat" - див. Запис у файлі Jargon ) використовується для позначення того, що запис у списку аргументів повинен "всмоктувати" список аргументів.

CoffeeScript дуже рано сприйняв урізноманітні стилі Ruby (див. Випуск 16 ), але за пропозицією Дугласа Крокфорда синтаксис було змінено *xна x...пару тижнів (див. Випуск 45 ). Тим не менш, CoffeeScripters все ще називають синтаксис як "splat" або "splat operator".

Щодо того, що вони насправді роблять, argumentssplats нарізає об'єкт таким чином, що аргументований аргумент стає масивом усіх "зайвих" аргументів. Найбільш банальний приклад - це

(args...) ->

У цьому випадку argsбуде просто копія масиву arguments. Планові аргументи можуть надходити або перед, після, або між стандартними аргументами:

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

У перших двох випадках, якщо функція отримує аргументи 0-1, restбуде порожнім масивом. В останньому випадку функції потрібно отримати більше 2 аргументів, restщоб бути не порожнім.

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


2
Подібно до paramsключового слова C # .
ThatMatthew

Коли мені коли-небудь потрібно це використовувати?
Джефф Скотт Уорд

1
коли ви не впевнені в кількості парам, які ви хочете прийняти.
gprasant

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]

6

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


Дивіться також: * args Python і ** kwargs та параметр відпочинку ActionScript 3.
Йорданія

3

Я думаю, що це синтаксичний цукор для об’єкта аргументів JavaScript.

Ідея може виникнути від оператора з* рубіном бризки .


Технічно, це трохи більше, так як він може використовуватися лівої руки-сторонній в призначеннях, і можуть бути об'єднані з іменованими аргументами: в (x, rest...) ->, restзвичай містити x, argumentsробить.
keppla
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.