2016-02-25 118 views
1

比方說,我有這個功能。如何將字符串的元組轉換爲字符串*?

def foo(bar: String*): String = { bar.mkString(", ") } 

它可以將一個或多個字符串值作爲參數。

scala> foo("hello", "world", "foo") 
res4: String = hello, world, foo 

但是,我該如何做到這一點,以下也適用。

scala> foo(("hello", "world", "foo")) 
<console>:26: error: type mismatch; 
found : (String, String, String) 
required: String 
       foo(("hello", "world", "foo")) 
      ^

可以作爲參數傳遞的字符串的數量可以是任意的。爲什麼我需要這個是因爲,我有另一種方法。

def fooHelper() = { 
    ("hello", "world", "foo") // Again, can be arbitrary number 
} 

我想這樣使用。

foo(fooHelper()) 
+0

我不認爲這是來自未知元數的元組調用可變參數的函數的通用方法。它可以使用列表值和':_ *'完成。否則,你可以看看無定形,這允許更通用。 – cchantep

回答

1

這可以用shapeless庫來完成:

> import shapeless._ 
> import syntax.std.tuple._ 

> def foo(any: Any *) = { any.foreach(println) } 
defined function foo 

> foo((23, "foo", true).toList:_*) 
23 
foo 
true 

另外,作爲支持階元組只到22元,你可以寫(生成)自己展開幫手。

3

不使用外部庫的簡單解決方案是使用將元組轉換爲迭代器的productIterator

使用像

foo(("a", "b").productIterator.toList.map(_.toString):_*)

相關問題