[英]Scala list match for type and size
我正在尝试在Scala中进行一些匹配,但遇到了一些问题。 这是我的代码(减去绒毛):
realtionships.filter(...) match {
case (parent: Relationship) :: Nil => parent.endNode
case _ => throw new Exception
}
要点是,我想要一个列表,该列表仅是Relationship
类型的单个项目。 如果还有其他问题,请抛出异常。 但是编译器给我这个错误:
constructor cannot be instantiated to expected type
found: scala.collection.immutable.::[B]
required: scala.collection.immutable.Set[Relationship]
为什么我会收到此错误? 在尝试匹配类型时,我是否不能匹配列表中的元素? 还是我语法错误? (旁注:关系是案例类。)
如果编译器可以推断出您试图匹配的类型不能相等,则它将拒绝模式匹配。 从错误消息中会出现relationships
是一个Set
而您正在尝试匹配一个List
。 现在, Set
永远不能是List
,因此编译器正确地拒绝了该代码。
如果您实际上想要一个List
,则可以执行它:
relationships.filter(...).toList match {
..
}
如果要坚持使用Set
,则需要Set
上的提取器。 但是,这不存在... 这是一个与答案相关的问题,向您展示了如何编写自定义提取器。 如果您不想付出这种努力,那么穷人的解决方案就是
val f = relationships.filter(...)
f.headOption match {
case Some(parent: Relationship) if f.size == 1 => parent.endNode
case _ => throw new Exception
}
(但是请注意, size
是O(N)运算)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.