5

Tener,Cómo pasar una o ninguna variable arg en scala?

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

me gustaría llamarlo con la lista de argumentos vacía dependiendo de la condición, pero evite if/else.

he salido con esta solución:

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

¿Hay mejor manera de que esto?

Para más contexto, estoy jugando con Scala Juego 2.0, y tienen la siguiente:

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

donde user._3 es booleano rembemberme.

Me gustaría no llamar con Session o llamarlo con la lista de argumentos vacía (no crear una instancia de Cookie) si rememberme es falso, de manera scala.

Gracias.

Respuesta

7

Creo que en este caso la incrustación de un if/else es la solución más limpia:

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

Gracias, estoy de acuerdo en que este es el más limpio, y realmente no lo hice quiero evitar if/else, pero evito crear una lista de instancias, así que me faltaba Seq.empty o Nil, así que la segunda respuesta también es útil :) – avalez

+1

@alavez si tu objetivo era evitar crear una lista, esto es un gran error, porque eso es exactamente lo que 'Seq' hace! Usted lo evita asignando la parte anterior con Cookies a un 'val t', y luego llamando a' if (user._3) t.withCookies (...) else t.withCookies() '. ¡Las variables temporales son buenas! –

+0

Gracias por tu comentario. ¿Estoy en lo cierto al pensar que usar Nil también evitará crear una instancia de la Lista? Y solo para una mejor comprensión, ¿es Seq.empty de alguna manera mejor o peor que Nil? – avalez

3

Mientras que Usar filtro de lista ciertamente funciona, parece inapropiado aquí ya que desea la lista completa o una lista vacía y no debería necesitar iterar sobre los miembros de la lista.

Si realmente quiere evitar if/else, se puede envolver la lista en un Option[List[Any]] y utilizar filter y getOrElse métodos de la opción

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

También es posible usar match, que en este caso es equivalente a if/else

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

Así que he terminado con: prueba ((si (condición) Sec ("uno") else cero): _ *) – avalez

Cuestiones relacionadas