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

标签 scala pattern-matching

电梯有 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/

相关文章:

arrays - Scala 中的初始数组元素?

scala - Shapeless 中 Nat 类型的限制

scala - Databinder调度: Get uncompressed content of a 403 response

java - 检测冗余规则的算法

haskell - 匹配数据构造函数

java - 如何使用Java检查句子中是否存在单词?

scala - 玩 2.6 Action 生成器

regex - 我可以在 HTML5 模式属性中使用包含 & 符号的正则表达式吗?

实现类似调查程序的算法

java - Scala、SQL Server - 如何使用 Scala 将当前时间戳作为日期时间插入 SQL Server 中?