Использование varargs из Scala
-
06-07-2019 - |
Вопрос
Я рву на себе волосы, пытаясь понять, как сделать следующее:
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 )
}
Выдает мне ошибку типа:
найденный:Массив[Любой]
требуется Seq[java.lang.Object]
Я попробовал кастинг, который компилируется, но терпит неудачу почти по той же причине, что и первый пример.Когда я пытаюсь
println(String.format(msg, (o :: List(os:_*)) :_* ))
это не может скомпилироваться с неявной неоднозначностью преобразования (any2ArrowAssoc
и any2stringadd
)
Решение
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 : _* ) )
Я предпочитаю последний вариант, хотя он не поддерживает локали*.
- Scala 2.8 имеет поддержку локали в формате RichString.
Не связан с StackOverflow