如何在scala中传递一个或者没有变量arg?

时间:2011-12-17 16:29:56

标签: scala playframework variadic-functions playframework-2.0

有,

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

我想根据条件使用空参数列表来调用它,但是要避免if / 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是假的,那就是scala方式。

谢谢。

2 个答案:

答案 0 :(得分:7)

我认为在这种情况下,嵌入if / else是最干净的解决方案:

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

答案 1 :(得分:3)

虽然使用列表过滤器肯定有效,但这里似乎不合适,因为您需要整个列表或空列表,并且不需要迭代列表成员。

如果你真的想避免使用if / else,你可以将列表包装在Option[List[Any]]中并使用Option的filtergetOrElse方法

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

您也可以使用match,在这种情况下等同于if / else

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