2009-12-02 130 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 – 2009-12-02 13:39:56

回答

93

foo(args:_*)有窍门。而不是将序列作为单个参数应用,序列中的每个元素都将用作参数。

+3

是否有代码审查友好,较少出现头痛的名称上述函数'''args:_ *' ' – Richeek 2015-06-16 21:31:36

+0

提供一个使之透明的api的一种方法是编写一个名为'foo'的代理函数,它可以进行转换。这样,你原来的'foo'调用可以在你的用户代码不用担心这个问题的情况下工作。话虽如此,如果'foo'需要像Seq'这样的集合而不是像'String'这样的基本类型,那么scala集合的不变性会妨碍你的api的任何理智用法。就好像可变参数列表和标准库集合并非针对除了vanilla之外的相互用例而设计的一样。 – matanster 2015-11-27 08:17:34

+0

@Richeek不幸的是,没有。 – Malcolm 2016-07-23 03:25:03