模式匹配List与子类条目

时间:2013-01-29 05:18:07

标签: scala map polymorphism pattern-matching

我创建了一个抽象基类,如下所示:

abstract class parent

然后我继续创建了两个从父类继承的case类:

case class child1(name:String,category:String) extends parent

case class child2(name:String,category1:String,category2:String) extends parent

然后,为了踢,我创建了一个父类型列表,并为其附加了child1和child2:

val childList = List[parent]()

scala> child1("Child","One") :: child2("Child","Two","dhshs")::childList
res2: List[parent] = List(child1(Child,One), child2(Child,Two,dhshs))

到目前为止,List [Parent]中有两个子类型。

现在,我想遍历List并根据子类的基础类型,为该特定类型执行特殊操作。所以我这样做:

scala> res2 map {case child1 => "Child1";case child2 => "Child2"}

我希望看到List[String]("Child1","Child2"),而我得到以下内容:

<console>:15: error: unreachable code
              res2 map {case child1 => "Child1";case child2 => "Child2"}

现在为了更多的踢,我做了以下几点:

scala> res2 map {r => r match {case child1 => "Child1"}}
res8: List[java.lang.String] = List(Child1, Child1)

scala> res2 map {case child1 => "Child1"}
res9: List[java.lang.String] = List(Child1, Child1)

正如你所看到的,我将“Child1”作为我的List条目,即使对于“child2”我也得到了Child1。

很困惑,有人能告诉我这里发生了什么吗?

1 个答案:

答案 0 :(得分:4)

问题在于:child1和child2是为容纳结果而创建的新变量。

res2 map {case child1 => "Child1";case child2 => "Child2"}

试试这个:

res2 map {case x:child1 => "Child1";case y:child2 => "Child2"}

xy分别是关联类型child1child2的变量。