繁体   English   中英

Scala列表匹配类型和大小

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM