gpt4 book ai didi

Scala 多级模式匹配

转载 作者:行者123 更新时间:2023-12-01 13:35:07 26 4
gpt4 key购买 nike

我坚持使用多级模式匹配,在下面的代码中我想匹配一个在多个级别检查的特定情况“cfe 是 Assignment,assignmentCfe.getRight 是 BinaryExpression,等等”,解决方案看起来丑,我希望 Scala 能给我提供更好的东西。 :)

  def findAll(cfg: Cfg, consumer: Consumer[Violation]): Unit = {
val fa = new FlowAnalyzer
val states = fa.analyze(cfg)

states.foreach { case (cfe, state) => cfe match {
case assign: Assignment => assign.getRight match {
case expression: BinaryExpression => expression.getOperator match {
case Operator.Div | Operator.Rem => processDivisions()
case _ =>
}
case _ =>
}
case _ =>
}
case _ =>
}
}

最后如何去掉这些空的default case?

另一种方法是使用嵌套条件,但 IntelliJ IDEA 让我可以将这些条件替换回模式匹配

states.foreach { case (cfe, state) => if (cfe.isInstanceOf[Assignment]) {
val assignment = cfe.asInstanceOf[Assignment]
if (assignment.getRight.isInstanceOf[BinaryExpression]) {
val expression = assignment.getRight.asInstanceOf[BinaryExpression]
if (expression.getOperator == Operator.Div || expression.getOperator == Operator.Rem) processDivisions()
}
}}

最佳答案

AssignmentBinaryExpression 本身是案例类吗?或者他们有对应的unapply方法吗?如果是这样,那么您可以嵌套模式匹配并忽略您不关心的字段。例如,像这样的东西:

def findAll(cfg: Cfg, consumer: Consumer[Violation]): Unit = {
val fa = new FlowAnalyzer
val states = fa.analyze(cfg)

states.foreach {
case (Assignment(_, BinaryExpression(_, _, Operator.Div | Operator.Rem)), _) => processDivisions()
case _ =>
}
}

这至少会将默认匹配的数量减少到 1。

如果这些不是案例类或没有提取器,那么如果这是代码中足够常见的(反)模式,您可以考虑编写自己的提取器:http://docs.scala-lang.org/tutorials/tour/extractor-objects.html

关于Scala 多级模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44122366/

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