Scala中Automaton样例类引用内部Transition类型的编译错误解决咨询
解决Scala Case Class中内部Trait的类型引用问题
你遇到的问题是Scala作用域规则导致的——在case class的主构造器参数列表里,你引用了self别名,但self =>是在类体的代码块里才定义的,参数列表的作用域还看不到这个别名,所以编译器报错找不到self。
先看你的原始代码:
case class Automaton(alphabet: Set[String], initial: String, finish: Set[String], transitions: Map[String, self.Transition] { self => trait Transition // concrete things omitted }
编译错误:
Error:(21, 47) not found: value self transitions: Map[String, self.Transition]) {
根据你的需求,我提供两种实用的解决方案:
方案一:通用内部Trait(所有实例共享类型)
如果你只需要Transition作为Automaton类的通用内部 trait,所有实例共享这个类型定义,可以用路径依赖类型明确指向类内部的Transition:
case class Automaton( alphabet: Set[String], initial: String, finish: Set[String], transitions: Map[String, Automaton#Transition] ) { trait Transition { // 这里添加Transition的具体逻辑,比如定义状态转移的核心方法 def nextState: String } }
这样编译完全正常,Automaton#Transition清晰指向类内部的trait,外部代码也能通过这个路径正确引用它。
方案二:实例独有的路径依赖类型
如果你确实需要每个Automaton实例的Transition是该实例独有的精确类型(确保transition严格属于当前自动机),主构造器参数里无法直接引用这个类型(因为实例还未初始化),可以把transitions改为类的成员变量:
case class Automaton( alphabet: Set[String], initial: String, finish: Set[String] ) { self => // 每个实例的Transition都是当前实例独有的类型 trait Transition { def fromState: String def toState: String } // 初始化空的转移映射,后续可以动态添加具体的Transition实现 var transitions: Map[String, self.Transition] = Map.empty }
这里self.Transition能正确指向当前实例的内部trait,完全满足你对"当前自动机所属精确类型"的要求。
内容的提问来源于stack exchange,提问作者Jason Hu
相关产品推荐
相关产品推荐

