Использование varargs из Scala - PullRequest
54 голосов
/ 17 июня 2009

Я рву волосы, пытаясь понять, как сделать следующее:

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

Есть причина, почему я должен объявлять метод с o и os Seq отдельно. По сути, я получаю метод форматирования, вызываемый с одним параметром объекта (типа List). Попытка:

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

Дает мне ошибку типа:

найдено: Array [Any]

требуется Seq [java.lang.Object]

Я пробовал приведение, которое компилируется, но завершается неудачно по той же причине, что и в первом примере. Когда я пытаюсь

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

это не компилируется с неявной неоднозначностью преобразования (any2ArrowAssoc и any2stringadd)

Ответы [ 2 ]

65 голосов
/ 17 июня 2009
def foo(msf: String, o: AnyRef, os: AnyRef*) = 
  println( String.format(msf, (o :: os.toList).toArray : _* ))
13 голосов
/ 18 июня 2009
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.
...