gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:51:43 24 4
gpt4 key购买 nike

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

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在模式匹配中使用它之前(编译器解析器似乎丢失了)。

关于Scala:具有可重用条件的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40607586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com