2009-12-02 174 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