Scala中如何访问列表内HuffmanNode对象的方法?
解决HuffmanNode实例方法访问报错的问题
先看一下你提供的代码:
class HuffmanNode(val chars: String, val occurrences: Int) { override def toString: String = "{" + chars + "|" + occurrences + "}" def absoluteValue: Int = occurrences def getChars: String = chars def getOccurrences: String = occurrences.toString } object HuffmanNode { def apply(chars: String, occurrences: Int): HuffmanNode = { new HuffmanNode(chars, occurrences) } } // 你创建的列表 val PQ: List[HuffmanNode] = List(HuffmanNode("a", 3), HuffmanNode("b", 3))
你调用PQ(0).getChars时出现unable to resolve symbol getChars错误,主要有这几个可能的原因和对应解决办法:
可能的原因及解决方案
1. REPL加载不完整(如果是在交互式环境测试)
如果你是在Scala REPL中逐段输入代码,可能修改HuffmanNode定义后没有重新加载整个类和伴生对象,导致编译器没识别到getChars方法。解决办法很简单:重启REPL,一次性执行所有代码(包括类定义、伴生对象和列表创建),再调用方法就没问题了。
2. 忽略了Scala的字段访问特性
在Scala中,用val修饰的类参数(比如你的val chars: String),编译器会自动生成公共的getter方法,你完全可以直接通过字段名访问,根本不需要额外定义getChars这类方法。这是Scala更简洁的风格,推荐这么用:
// 直接访问字段,效果和调用getChars一致 println(PQ(0).chars) // 输出 "a" println(PQ(0).occurrences) // 输出 3
3. 作用域问题(如果代码分文件存放)
如果你的HuffmanNode类和伴生对象分开放在不同的源文件里,或者定义在某个私有作用域中,外部可能无法访问到方法。确保类和伴生对象在同一个源文件中,且处于公共作用域(比如包级),这样就能正常访问方法了。
完整可运行示例
如果你坚持要保留自定义的getChars和getOccurrences方法,这里给你一个完整的可运行代码示例,放在同一个源文件里就能正常编译执行:
class HuffmanNode(val chars: String, val occurrences: Int) { override def toString: String = "{" + chars + "|" + occurrences + "}" def absoluteValue: Int = occurrences def getChars: String = chars def getOccurrences: String = occurrences.toString } object HuffmanNode { def apply(chars: String, occurrences: Int): HuffmanNode = { new HuffmanNode(chars, occurrences) } } // 主对象用于测试 object HuffmanTest extends App { val PQ: List[HuffmanNode] = List(HuffmanNode("a", 3), HuffmanNode("b", 3)) println(PQ(0).getChars) // 输出 "a" println(PQ(0).getOccurrences) // 输出 "3" println(PQ(0).absoluteValue) // 输出 3 }
内容的提问来源于stack exchange,提问作者Vasu
相关产品推荐
相关产品推荐

