我试图根据列表的内部元素,特别是它们的类型,将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中集合中存在的值类型匹配的惯用方法是什么?
答案 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!"
}
请注意,您不会在打印声明中使用这些汽车,因此我没有标记它们 - 而是我将它们留作_