Использование varargs от Scala


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

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

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

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

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

найдено: массив[любой]

требуются Seq[java.ленг.Объект]

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

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

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

2 54

2 ответа:

def foo(msf: String, o: AnyRef, os: AnyRef*) = 
  println( String.format(msf, (o :: os.toList).toArray : _* ))
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 : _* ) )

Я предпочитаю последнее, хотя у него нет поддержки locale*.

  • Scala 2.8 имеет поддержку локали с форматом RichString.