斯卡拉鸭打字模式匹配
发布时间:2020-12-16 08:58:28 所属栏目:安全 来源:网络整理
导读:我有一个类似下面的案例类: // parent classsealed abstract class Exp()// the case classes I want to match have compatible constructorscase class A (a : Exp,b : Exp) extends Expcase class B (a : Exp,b : Exp) extends Expcase class C (a : Exp,
我有一个类似下面的案例类:
// 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) case e @ C (a,b) ... } def foo(e : Exp,abc : Exp) { ... } 有没有办法将这三种情况合并为一个案例(不向A,B,C添加中间父类)?我无法更改A,C或Exp的定义.某种: var n : Exp = ... n match { ... case e @ (A | B | C) (a,b) => // invalid syntax foo(e,b) ... } 这显然不起作用,也没有: var n : Exp = ... n match { ... case e @ (A (a,b) | B (a,b) | C (a,b)) => // type error foo(e,b) ... } 解决方法
虽然以下“解决方案”实际上只是编写已有内容的另一种方式,但如果您需要在多个位置使用相同的匹配并希望避免代码重复,则可能会有所帮助.
以下自定义不适用: object ExpABC { def unapply(e:Exp):Option[(Int,Int)] = e match { case A(a,b) => Some(a,b) case B(a,b) case C(a,b) case _ => None } } 允许你写 n match { case e @ ExpABC(a,b) => println(e) println(a) println(b) } 这样您根本不需要修改原始类.我不知道更好的方法来做这个不涉及修改A / B / C类,但我渴望学习@ Stackoverflow;) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |