2011-04-13 61 views
14

給出例如:scala splat可以用於任何不是可變參數的東西嗎?

scala> def pipes(strings:String*) = strings.toList.mkString("|") 

,我可以正常撥打:

scala> pipes("foo", "bar") 
res1: String = foo|bar 

或用圖示:

scala> val args = List("a","b","c") 
scala> pipes(args:_*) 
res2: String = a|b|c 

,但我可以用圖示爲任何東西,但提供的參數可變參數? e.g我想這樣做:

scala> def pipeItAfterIncrementing(i:Int, s:String) = (i + 1) + "|" + s 
scala> val args:Tuple2[Int, String] = (1, "two") 
scala> pipeItAfterIncrementing(args:_*) 

這並不工作,但有什麼辦法,實現從單一對象提供多個參數,無論它是一個元組或其他東西的同樣的效果?考慮到它們的長度和類型在編譯時是已知的,是否有任何理由不能爲元組實現呢?

回答

21

您可以使用Function.tupled來做到這一點:把一個函數,ň參數放進一個接受參數數量ň的一個元組參數的函數。可以預計,Function.untupled做相反的工作。

特殊類型歸屬: _*僅適用於重複參數(又名可變參數)。

scala> def pipeItAfterIncrementing(i:Int, s:String) = (i + 1) + "|" + s 
pipeItAfterIncrementing: (i: Int,s: String)java.lang.String 

scala> def tupledPipeItAfterIncrementing = Function.tupled(pipeItAfterIncrementing _) 
tupledPipeItAfterIncrementing: ((Int, String)) => java.lang.String 

scala> val args:Tuple2[Int, String] = (1, "two") 
args: (Int, String) = (1,two) 

scala> tupledPipeItAfterIncrementing(args) 
res0: java.lang.String = 2|two 
12

好樣的......

scala> def pipeItAfterIncrementing(i:Int, s:String) = (i + 1) + "|" + s 
scala> val args:Tuple2[Int, String] = (1, "two") 
scala> (pipeItAfterIncrementing _).tupled(args) 

會給你想要的2|two

+0

好的答案,恐怕JPP只是擊敗了你;) – gfxmonk 2011-04-13 13:01:04

+0

你被允許(和鼓勵)upvote多個答案。只是「接受」就減少爲一個答案。 – 2011-04-13 13:08:43

+0

另外,你的回答也表明'tupled'除了'Function'對象外還是'Function'實例的一個方法。 – 2011-04-13 13:13:17

相關問題