gpt4 book ai didi

scala - 理解与子类的模式匹配

转载 作者:行者123 更新时间:2023-12-02 06:57:41 27 4
gpt4 key购买 nike

电梯有 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(_, _, _)。这是为什么?

最佳答案

这就是继承的全部要点。如果 SC 的子类,那么您应该能够使用 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/

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