2009-06-17 151 views
54

使用可變參數我撕裂了我的頭髮試圖找出如何做到以下幾點:從斯卡拉

def foo(msf: String, o: Any, os: Any*) = { 
    println(String.format(msf, o :: List(os:_*))) 
} 

還有一個原因,我不得不宣佈與oosSeq單獨的方法。基本上,我最終使用單個對象參數(類型List)調用的格式方法。嘗試:

def foo(msf: String, o: Any, os: Any*) = { 
    println(String.format(msf, (o :: List(os:_*))).toArray) 
} 

給我的錯誤類型:

found: Array[Any]

required Seq[java.lang.Object]

我已經試過鑄造,其中編譯,但失敗了幾乎相同的理由,第一個例子。當我嘗試

println(String.format(msg, (o :: List(os:_*)) :_*)) 

失敗與隱式轉換歧義(any2ArrowAssocany2stringadd

回答

65
def foo(msf: String, o: AnyRef, os: AnyRef*) = 
    println(String.format(msf, (o :: os.toList).toArray : _*)) 
+0

它編譯但在運行時翻倒: 異常在線程「主要」 java.lang.ClassCastException:斯卡拉$結腸結腸$不能轉換爲scala.runtime.BoxedObjectArray \t在scala.runtime.RichString .format(RichString.scala:242) – 2009-06-18 06:30:16

+0

另外,toList從哪裏來? – 2009-06-18 07:43:03

12
def foo(msf: String, o: AnyRef, os: AnyRef*) = 
    println(String.format(msf, o :: os.toList : _*)) 

def foo(msf: String, o: AnyRef, os: AnyRef*) = 
     println(msf format (o :: os.toList : _*)) 

,我更喜歡後者編譯,儘管它有沒有語言環境*支持。

  • Scala 2.8具有RichString格式的語言環境支持。