Scala:针对通用列表类型的模式匹配

时间:2014-08-04 02:05:27

标签: scala collections types

我试图根据列表的内部元素,特别是它们的类型,将List与某些操作匹配:

def car1 = new Car[Racing] {}
def car2 = new Car[Pickup] {}

var myCars = List(car1,car2)

myCars match {

     case Racing :: Pickup => print("your first car is awesome but not your 2nd!"

}

显然,上面的案例是尝试伪代码描述我正在尝试做什么,但是,它失败了。

与scala中集合中存在的值类型匹配的惯用方法是什么?

2 个答案:

答案 0 :(得分:1)

我会创建第三个类(让它称之为CarModel),Racing和Pickup都可以扩展,然后以下代码可以工作:

def traverseList(list: List[CarModel]): Unit = list match {
  case (raceCar: Racing) :: rest => {
    print("your first car is awesome but not your 2nd!")
    traverseList(rest)
  }
  case (pickUpCar: PickUp) :: rest => {
    doSomethingElse()
    traverseList(rest)
  }
  case Nil => 
}

以上是检查列表中每个类型的递归示例,但如果要检查列表中的第一个元素,则可以使用匹配语句和列表。

如果您想检查列表的类型,正如@Naetmul所提到的那样,您将遇到type erasure。如果你想验证列表的类型,这个post解释了克服它的方法。

如果您有任何疑问,请与我们联系!

答案 1 :(得分:1)

如果您只有2个元素,不确定为什么使用列表 - 建议使用元组代替。无论如何,我这样做:

myCars match {
  case List((_: Racing), (_: Pickup)) => 
    print("your first car is awesome but not your 2nd!"
}

请注意,您不会在打印声明中使用这些汽车,因此我没有标记它们 - 而是我将它们留作_