电梯有 Box案例类。
我编写了以下方法在 Box[A]
上进行模式匹配:
scala> import net.liftweb.common._
import net.liftweb.common._
scala> def foo[A](box: Box[A]) = box match {
| case Empty | Failure(_, _, _) => true
| case Full(_) => false
| }
foo: [A](box: net.liftweb.common.Box[A])Boolean
我编写此方法是为了了解 ParamFailure
(Failure
的子类)是否会在 Failure(_, _, _) 上进行模式匹配)
大小写。
scala> val pf: Box[String] = ParamFailure("a", Empty, Empty, "blah")
pf: net.liftweb.common.Box[String] = ParamFailure(a, Empty, Empty, blah)
而且,确实如此。
scala> foo(pf)
res9: Boolean = true
我不清楚为什么 ParamFailure
会匹配到 Failure(_, _, _)
。这是为什么?
最佳答案
这就是继承的全部要点。如果 S
是 C
的子类,那么您应该能够使用 S
绝对无处不在您使用 C
(这称为 Liskov Substitution Principle)。
包括模式匹配。
现在,如果您特别想知道您是否有 S
而不是 C
,您可以检查它:
class C {}
class S extends C {}
val c: C = new S
c match {
case s: S => println("Actually, I was an S")
case _ => println("Guess I was some other kind of C")
}
但是如果你问它是不是C
,答案是肯定的:
c match {
case c2: C => println("Yes, of course I am a C!")
case _ => println("This would be super-weird.")
}
同样,添加模式匹配在这里没有任何改变;无论您是知道类型然后手动提取参数,还是 Scala 帮助您为它们提供标识符,它的工作方式都是一样的。
case class P(p: Boolean) {}
object T extends P(true) {}
val p: P = T
p match {
case P(tf) => println(tf)
case _ => println("You will never reach here.")
}
关于scala - 理解与子类的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28056521/