scala - 在斯卡拉重用 guard

标签 scala

我经常发现自己想在scala中重用后卫评估的结果,例如

blah match {
  case Blah(a, b) if expensive(a) < 10 =>
     expensive(a)
  case _ => b
}


使用一些鲜为人知的咒语有可能吗? (将@放在expensive上无效)

不久有可能吗?

最佳答案

您可以使用自定义提取器执行类似的操作。这应该工作:

case class Blah(a: Int, b: Int)

object expensive {
  def unapply(x: Int): Option[Double] = Some(math.cos(x))
}

Blah(1, 1) match {
  case Blah(a @ expensive(e), b) if e < 10 => println(a, b, e)
  case _ => println("nothing")
}


确保expensive确实比创建Option对象昂贵,这就是上面所做的。

关于scala - 在斯卡拉重用 guard ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18577771/

相关文章:

scala - 在文件中的字符上使用迭代器时,scala 中的令人惊讶的行为

java - 如何处理 Java 中的 Scala 类型中的协变

scala - 从Apache Spark填充Elasticsearch日期

Scala包冲突

scala - 使用 Akka 通过 WebSocket 流式传输分页 API 响应

scala - 使用 Gradle 从单个源项目编译多个 jar

mysql - Slick 3 - SQL Plain - MySQL 日期

java - Scala 的 TreeSet 与 Java 的 TreeSet - 轮询?

scala - scala.collection.Seq.groupBy() 函数是否保留顺序?

scala - 如何在转换 Scala Spark DF -> RDD 时保留类型?