2014-11-08 3 views
2

Я настроил функцию с переменными аргументами:Передача переменных аргументов в функции

myfunc: (cmd, args...)-> 
    # cmd is a string 
    # args is an array 

И можно назвать как:

myfunc("one") # cmd = "one", args = undefined 
myfunc("one","two") # cmd = "one", args = ["two"] 
# etc... 

Теперь, если я хочу, чтобы вызвать ее с неизвестным числом аргументов? Предположим, я хочу передать массив аргументов вместо arg1, arg2, arg3,.., как это возможно?

Попытка myfunc("one",["two","three"]) или myfunc("one",someArgs) приводит к несчастному:

# cmd = "one" 
# args = [ ["two","three"] ]; 

Идеи?


P.S. Я сделал это для работы, добавив эти сверхпростые линии в свою функцию. Но другого пути нет?

if args? and args[0] instanceof Array 
    args = args[0] 

ответ

3

Вам не нужно вручную использовать Function.prototype.apply для этого. Splats могут использоваться в аргументе для списка для построения массива или вызова функции для расширения массива; от the fine manual:

Splats ...

[...] CoffeeScript обеспечивает Splats ..., как для определения функции, а также вызов, делая переменное количество аргументов немного более аппетитных.

awardMedals = (first, second, others...) -> 
    #... 

contenders = [ 
    #... 
] 

awardMedals contenders... 

Так что вы можете сказать что-то вроде этого:

f('one') 

f('one', 'two') 

f('one', ['two', 'three']...) 
# same as f('one', 'two', 'three') 

args = ['where', 'is', 'pancakes', 'house?'] 
f(args...) 
# same as f('where', 'is', 'pancakes', 'house?') 

и The Right Thing будет.

Демонстрация: http://jsfiddle.net/ambiguous/ztesehsj/

Смежные вопросы