5

Avendo,Come passare una o nessuna variabile arg in scala?

def test(args: Any*) = args.size 

mi piacerebbe chiamarlo con lista di argomenti vuota a seconda delle condizioni, ma evitare if/else.

sono venuto fuori con questa soluzione:

test(List("one").filter(_ => condition) : _*) 

Non c'è modo migliore di questo?

Per ulteriori contesto, sto giocando con Play 2.0 scala, e avere questo:

user => Redirect(routes.Application.index).withSession("username" -> user._1).withCookies(
    List(Cookie("rememberme", Crypto.sign(user._1) + "-" + user._1)).filter(_ => user._3) : _*) 

dove user._3 è booleano rembemberme.

Mi piacerebbe non chiamare conSession o chiamarlo con un elenco di argomenti vuoto (non per istanziare Cookie) se rememberme è falso, in scala.

Grazie.

risposta

7

credo che in questo caso l'incorporamento di un if/else è la soluzione più pulita:

test((if (condition) Seq("one") else Seq.empty) : _*) 
+0

Grazie, sono d'accordo questo è il più pulito, e davvero non ho voglio evitare se/else, ma evitare la lista di istanze, quindi mi mancava solo Seq.empty o Nil, quindi è utile anche la seconda risposta :) – avalez

+1

@alavez se il tuo obiettivo era evitare di creare un'istanza di List, questo è un grosso fallimento, perché questo è esattamente ciò che 'Seq' fa! Lo si evita assegnando la parte prima con i cookie a un 'val t', quindi chiamando' if (utente._3) t.withCookies (...) altro t.withCookies() '. Le variabili temporanee sono buone! –

+0

Grazie per il tuo commento. Ho ragione nel pensare che l'utilizzo di Nil eviterà anche l'istanziazione di List? E solo per una migliore comprensione, Seq.empty è in qualche modo migliore o peggiore di Nil? – avalez

3

Mentre utilizzare il filtro di elenco funziona certamente, sembra inappropriato qui poiché si desidera l'intero elenco o una lista vuota e non dovrebbe essere necessario scorrere i membri della lista.

Se davvero si vuole evitare di if/else, si potrebbe avvolgere l'elenco in un Option[List[Any]] e utilizzare filter e getOrElse metodi dell'opzione

test(Some(List("one")).filter{_ => condition}.getOrElse(Nil): _*) 

Si potrebbe anche usare match, che in questo caso è equivalente a if/else

test((condition match {case true => List("one"); case _ => Nil}) : _*) 
+0

Così ho finito con: prova ((if (condizione) Seq ("uno") else Nil): _ *) – avalez

Problemi correlati