Usando varargs da Scala
-
06-07-2019 - |
Domanda
Mi sto strappando i capelli cercando di capire come fare:
def foo(msf: String, o: Any, os: Any*) = {
println( String.format(msf, o :: List(os:_*)) )
}
C'è un motivo per cui devo dichiarare il metodo con un o
e un os
Seq
separatamente. Fondamentalmente, finisco con il metodo di formattazione chiamato con un singolo parametro oggetto (di tipo List
). Cercando:
def foo(msf: String, o: Any, os: Any*) = {
println( String.format(msf, (o :: List(os:_*))).toArray )
}
Mi dà l'errore di tipo:
trovato: Array [Qualsiasi]
richiesto Seq [java.lang.Object]
Ho provato il casting, che si compila ma fallisce praticamente per lo stesso motivo del primo esempio. Quando provo
println(String.format(msg, (o :: List(os:_*)) :_* ))
questo non riesce a compilare con ambiguità di conversione implicita ( any2ArrowAssoc
e any2stringadd
)
Soluzione
def foo(msf: String, o: AnyRef, os: AnyRef*) =
println( String.format(msf, (o :: os.toList).toArray : _* ))
Altri suggerimenti
def foo(msf: String, o: AnyRef, os: AnyRef*) =
println( String.format(msf, o :: os.toList : _* ) )
o
def foo(msf: String, o: AnyRef, os: AnyRef*) =
println( msf format (o :: os.toList : _* ) )
Preferisco di gran lunga quest'ultima, sebbene non abbia supporto per le impostazioni locali *.
- Scala 2.8 supporta le impostazioni locali con il formato RichString.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow