首页 > 解决方案 > Scala匹配:使用仅在子类中可用的值

问题描述

我有代码

abstract class Base

case class C1(val value1: Int) extends Base
case class C2(val value2: Int) extends Base

def match_test(thing: Base) = thing match {
  case _: C1 => println(C1.value1)
  case _: C2 => println(C2.value2)
}

但是,编译器会产生错误(大致):

value1 is not a member of object C1
value2 is not a member of object C2

我不明白为什么会产生这个错误。在每种情况下,它都匹配一个子类,并且该子类具有所需的值。

你如何正确地进行这种类型的模式匹配?

标签: scalapattern-matching

解决方案


您需要在类的实例上引用 val,而不是类本身:

def matchTest(thing: Base) = thing match {
  case x: C1 => println(x.value1)
  case y: C2 => println(y.value2)
}

您也可以像这样解包对象,因为您使用的是案例类:

def matchTest(thing: Base) = thing match {
  case C1(v1) => println(v1)
  case C2(v2) => println(v2)
}

推荐阅读