【问题标题】:How to pass one or none variable arg in scala?如何在scala中传递一个或没有变量arg?
【发布时间】:2012-01-22 16:29:12
【问题描述】:

拥有,

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 是布尔值。

如果rememberme 为false,我不想以scala 方式调用withSession 或使用空参数列表调用它(不实例化Cookie)。

谢谢。

【问题讨论】:

    标签: scala playframework variadic-functions playframework-2.0


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,我同意这是最干净的,我真的不想避免 if/else,而是避免实例化列表,所以我只是缺少 Seq.empty 或 Nil,所以第二个答案是也很有用:)
    • @alavez 如果您的目标是避免实例化列表,这是一个很大的失败,因为这正是 Seq 所做的!您可以通过将 withCookies 之前的部分分配给val t,然后调用if (user._3) t.withCookies(...) else t.withCookies() 来避免它。临时变量很好!
    • 感谢您的评论。我是否正确地认为使用 Nil 也会避免实例化 List ?为了更好地理解,Seq.empty 在某种程度上比 Nil 更好还是更差?
    【解决方案2】:

    虽然使用列表过滤器确实有效,但在这里似乎不合适,因为您想要整个列表或空列表,并且不需要遍历列表成员。

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

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

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

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

    【讨论】:

    • 所以我的结尾是:test((if (condition) Seq("one") else Nil) : _*)
    猜你喜欢
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 2012-07-19
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多