Как передать одну или ни одной переменной arg в scala? - PullRequest
5 голосов
/ 17 декабря 2011

Имея,

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

Я хотел бы вызвать его с пустым списком аргументов в зависимости от условия, но избегать, если / else.

Я пришел с этим решением:

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

Есть ли лучший способ, чем этот?

Для большего контекста, я играю с Play 2.0 Scala, и у меня есть это:

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

где user._3 rembemberme boolean.

Я бы не хотел вызывать withSession или вызывать его с пустым списком аргументов (не для создания экземпляра Cookie), если Rememberme имеет значение false, в стиле scala.

Спасибо.

Ответы [ 2 ]

7 голосов
/ 17 декабря 2011

Я думаю, что в этом случае встраивание if / else является самым чистым решением:

test((if (condition) Seq("one") else Seq.empty) : _*)
3 голосов
/ 17 декабря 2011

Хотя использование фильтра списка, безусловно, работает, здесь это кажется неуместным, поскольку вам нужен либо весь список, либо пустой список, и вам не нужно перебирать членов списка.

Если вы действительно хотите избежать if / else, вы можете заключить список в Option[List[Any]] и использовать filter и getOrElse методы Option

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

Вы также можетеиспользуйте match, что в данном случае эквивалентно if / else

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