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 )

È stato utile?

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
scroll top