gpt4 book ai didi

scala - 在scala中匹配多个案例类

转载 作者:行者123 更新时间:2023-12-03 04:50:58 25 4
gpt4 key购买 nike

我正在对某些案例类进行匹配,并希望以相同的方式处理其中两个案例。像这样的事情:

abstract class Foo
case class A extends Foo
case class B(s:String) extends Foo
case class C(s:String) extends Foo


def matcher(l: Foo): String = {
l match {
case A() => "A"
case B(sb) | C(sc) => "B"
case _ => "default"
}
}

但是当我这样做时,我收到错误:

(fragment of test.scala):10: error: illegal variable in pattern alternative
case B(sb) | C(sc) => "B"

我可以通过从 B 和 C 的定义中删除参数来使其工作,但如何与参数匹配?

最佳答案

看起来您并不关心 String 参数的值,并且希望将 B 和 C 视为相同,因此:

def matcher(l: Foo): String = {
l match {
case A() => "A"
case B(_) | C(_) => "B"
case _ => "default"
}
}

如果您必须、必须、必须提取参数并在同一代码块中处理它们,您可以:

def matcher(l: Foo): String = {
l match {
case A() => "A"
case bOrC @ (B(_) | C(_)) => {
val s = bOrC.asInstanceOf[{def s: String}].s // ugly, ugly
"B(" + s + ")"
}
case _ => "default"
}
}

尽管我觉得将其分解为方法会更清晰:

def doB(s: String) = { "B(" + s + ")" }

def matcher(l: Foo): String = {
l match {
case A() => "A"
case B(s) => doB(s)
case C(s) => doB(s)
case _ => "default"
}
}

关于scala - 在scala中匹配多个案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1837754/

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