为什么Scala中foldLeft无法访问自定义类的成员属性?
问题原因
你定义的Box属于Scala普通非样例类,构造参数默认不会生成为类的公开可访问成员:
- 构造参数前不加
val/var修饰时,参数仅在类内部可见,外部实例无法直接访问 - 如果定义为样例类
case class Box(...),Scala会默认给所有构造参数加val修饰,自动生成公开的getter方法,才可以直接用.size访问属性
修复方案
两种可选方案都可以解决报错:
方案1:给构造参数添加val修饰
修改类定义,显式声明参数为公开成员:
class Box(val color: String = "", val size: Int = 0)
方案2:直接定义为样例类
对于这种仅承载数据的类,样例类是更合适的选择,无需手动加val即可访问参数:
case class Box(color: String = "", size: Int = 0)
额外优化建议:你的现有foldLeft逻辑仅能过滤相邻的重复size元素,如果要实现全局按size去重,可以直接用Scala标准库提供的distinctBy方法,代码更简洁:
s.distinctBy(_.size)
内容的提问来源于stack exchange,提问作者tastyminerals
相关产品推荐
相关产品推荐

