如何解决for-comprehension:类型不匹配 - 必需的 Option[?]
我对在项目中使用 Scala 比较陌生,并且偶然发现了一个我不明白的问题。
这是我的代码。为了清楚起见,我注释了类型:
val fcs = for {
fc: Call <- funCalls
ann: List[CapabilityArg] <- context.annotationOption(Annotations.CapabilityArguments,fc)
arg: CapabilityArg <- ann
} yield CapabilityInfo(
"CapabilityArgument",arg.id.name,new LSPRange,new LSPRange
)
哪个错误:
type mismatch;
found : List[LSPServer.this.CapabilityInfo]
required: Option[?]
如果删除 for-comprehension 中的最后一行,错误就会消失。那条线不应该没问题,因为我只映射了 List[CapabilityArg]?
先谢谢你!
解决方法
问题是您在 List
中混合了 Option
和 for
。 for
的结果集合类型是第一行的集合类型,我假设是 Option
。 for
中的最后一行将生成多个值,但 Option
只能保存一个值。
这可能就是你想要的:
val fcs = for {
fc: Call <- funCalls
ann: List[CapabilityArg] <- context.annotationOption(Annotations.CapabilityArguments,fc)
} yield {
ann.map(arg => CapabilityInfo(
"CapabilityArgument",arg.id.name,new LSPRange,new LSPRange
))
}
这将返回 Option[List[CapabilityInfo]]
感谢@Tim 我想出了这个解决方案:
val fcs = for {
fc: Call <- funCalls : Array[Call]
ann: List[CapabilityArg] <- context.annotationOption(Annotations.CapabilityArguments,fc) : Option[List[CapabilityArg]]
} yield {
ann.toArray.map(arg =>
CapabilityInfo("CapabilityArgument",new LSPRange)
)
}
return fcs.flatten
我将 funCalls 切换为 Array[Call] 类型,因此我生成了一个 Array[CapabilityInfo],然后将其打包到另一个数组中。然后将结果展平,为我提供所需的所有 CapabilityInfo 的一维数组。
事后看来,我可能应该使用常规的嵌套 for-each 构造?!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。