Scala:具有可重用条件的模式匹配

2024-05-01

考虑这种模式匹配的情况:

foo match {
    case x if expensiveCalculation(x).nonEmpty => // do something with expensiveCalculation(x)
...
}

是否可以“标记”或重复使用expensiveCalculation(x)之后=>?

理想情况下,我期待类似的事情:

foo match {
        case x val ec = expensiveCalculation(x); if ec.nonEmpty => // do something with ec
    ...
    }

您可以为以下类型编写一个提取器x(这里假设InputType):

object Expensive {
  def unapply(x: InputType): Option[OutputType] = expensiveCalculation(x)
}

现在,您可以在模式匹配中使用它:

fooList match {
  case _ :: Expensive(output) :: _ => ...
  case _ :: x :: _ => ...
}

但是,如果您对许多计算执行此操作(每次都需要定义提取器),那么这是一种执行您想要的操作的麻烦方法。

您可以通过定义以下内容来一劳永逸地完成此操作:

case class Comput[-A, +B](f: A => Option[B]) {
  def unapply(a: A): Option[B] = f(a)
}

现在,您可以按如下方式使用它:

val intString = "10"
val IntOf = Comput[String, Int](s => Try(s.toInt).toOption)

intString match {
  case IntOf(x) => x
  case other => 0
} // returns 10: Int

但是,您不能免除定义IntOf在模式匹配中使用它之前(编译器解析器似乎丢失了)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala:具有可重用条件的模式匹配 的相关文章

随机推荐