2009-12-02 2 views
47

Задана функция, которая принимает переменное количество аргументов, например.Scala: передать функции Seq в var-args

def foo(os: String*) = 
    println(os.toList) 

Как передать последовательность аргументов функции? Я хотел бы написать:

val args = Seq("hi", "there") 
foo(args) 

Очевидно, что это не работает.

+0

См. Также: http://stackoverflow.com/questions/1008783/using-varargs-from-scala –

ответ

93

foo(args:_*) делает трюк. Вместо того, чтобы применять последовательность как один единственный аргумент, каждый элемент в последовательности будет использоваться в качестве аргумента.

+3

есть ли отзыв с кодовым обзором, менее склонным к головной боли для вышеупомянутой функции '' 'args: _ *' '' – Richeek

+0

Один из способов предоставить api, который делает это прозрачным, - это написать прокси-функцию с именем 'foo', которая делает преобразование. Таким образом, ваш первоначальный вызов 'foo' будет работать, если ваш код пользователя не должен беспокоиться об этом. Сказав это, если 'foo' потребовал сбор, такой как' Seq', а не примитивный тип, такой как 'String', инвариантность коллекций scala помешала бы любому разумному использованию вашего api. Как будто списки переменных аргументов и стандартные коллекции библиотек не были разработаны для случаев взаимного использования за пределами ванили. – matanster

+0

@Richeek К сожалению, нет. – Malcolm

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