gpt4 book ai didi

Scala 鸭子打字模式匹配

转载 作者:行者123 更新时间:2023-12-04 06:42:26 25 4
gpt4 key购买 nike

我有一个像下面这样的案例类:

// parent class
sealed abstract class Exp()

// the case classes I want to match have compatible constructors
case class A (a : Exp, b : Exp) extends Exp
case class B (a : Exp, b : Exp) extends Exp
case class C (a : Exp, b : Exp) extends Exp

// there are other case classes extending Exp that have incompatible constructor, e.g.
// case class D (a : Exp) extends Exp
// case class E () extends Exp
// I don't want to match them

我想匹配:
var n : Exp = ...
n match {
...
case e @ A (a, b) =>
foo(e, a)
foo(e, b)
case e @ B (a, b) =>
foo(e, a)
foo(e, b)
case e @ C (a, b) =>
foo(e, a)
foo(e, b)
...
}

def foo(e : Exp, abc : Exp) { ... }

有没有办法将这三个案例合并为一个案例(不向 A、B、C 添加中间父类)?我无法更改 A、B、C 或 Exp 的定义。某种:
var n : Exp = ...
n match {
...
case e @ (A | B | C) (a, b) => // invalid syntax
foo(e, a)
foo(e, b)
...
}

这显然不起作用,也不行:
var n : Exp = ...
n match {
...
case e @ (A (a, b) | B (a, b) | C (a, b)) => // type error
foo(e, a)
foo(e, b)
...
}

最佳答案

虽然以下“解决方案”实际上只是编写您已有内容的另一种方式,但如果您需要使用相同的 match 可能会有所帮助。在多个地方,并希望避免代码重复。

以下自定义不适用:

object ExpABC {
def unapply(e:Exp):Option[(Int, Int)] = e match {
case A(a, b) => Some(a, b)
case B(a, b) => Some(a, b)
case C(a, b) => Some(a, b)
case _ => None
}
}

允许你写
n match {
case e @ ExpABC(a, b) =>
println(e)
println(a)
println(b)
}

这样您根本不需要修改原始类。我不知道有更好的方法来做到这一点,不涉及修改 A/B/C 类,但我很想学习 @Stackoverflow ;)

关于Scala 鸭子打字模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12712922/

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