Scala函数报错修复:检测站点ID是否存在于目标站点序列
问题修复方案
错误原因分析
- Targeting类并非泛型类:你定义的
case class Targeting(targetedSiteIds: Seq[String])没有类型参数,但函数filterSitesById中错误地将参数声明为Targeting[Seq[String]],这导致了Targeting does not take type parameters的报错。 - 函数逻辑错误:
Targeting实例不是集合类型,不能直接调用fold方法;同时目标站点ID序列中的元素是字符串,不存在idx属性,直接用字符串比较即可。 - 代码顺序问题:在Scala中,必须先定义
case class才能实例化它,原代码中实例化Targeting的代码在类定义之前,这也是潜在错误。 - 变量声明缺失:
targeting = ...缺少val或var关键字,属于语法错误。
修复后的完整代码
val site_id = "0011a522ce0f4bbbbaa6b3c38cafaa0f" // 先定义case class,再实例化 case class Targeting(targetedSiteIds: Seq[String]) // 正确声明变量并实例化Targeting val targeting = Targeting( targetedSiteIds = Seq( "0009a522ce0f4bbbbaa6b3c38cafaa0f", "0010a522ce0f4bbbbaa6b3c38cafaa0f", "0011a522ce0f4bbbbaa6b3c38cafaa0f" ) ) // 修正函数参数类型与逻辑 def filterSitesById(sites: Targeting): Boolean = { sites.targetedSiteIds.contains(site_id) } // 调用函数获取结果 val trueOrFalse = filterSitesById(targeting) // 结果为true
关键修复点说明
- 移除函数参数中的
[Seq[String]],因为Targeting不是泛型类。 - 直接访问
Targeting实例的targetedSiteIds字段,使用contains方法判断站点ID是否存在,逻辑更简洁清晰。 - 调整代码顺序,确保
case class定义在实例化之前。 - 为
targeting变量添加val关键字,修正语法错误。
内容的提问来源于stack exchange,提问作者Vakindu
相关产品推荐
相关产品推荐

