明明已实现特征却提示缺失?Rust特征编译报错咨询
Rust特征实现编译错误解析
问题代码
trait HasMouth { fn speak(&self); } trait Animal : HasMouth {} trait Human : Animal { fn speak(&self) { println!("Hey there! I'm a human!"); } } impl<T: Human + Animal> HasMouth for T { }
编译错误
| | fn speak(&self); | ---------------------- `speak` from trait ... | impl<T: Human + Animal> HasMouth for T { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `speak` in implementation
问题原因
Rust的特征系统中,子特征的默认方法不会自动被视为父特征的实现。虽然Human提供了speak的默认实现,但这属于Human特征自身的方法,和HasMouth特征要求的speak方法没有直接关联。当你为所有实现Human + Animal的类型实现HasMouth时,编译器要求必须明确提供HasMouth中speak方法的实现,不会自动复用Human的版本。
解决方法
在HasMouth的实现中显式调用Human的speak方法,完成方法转发:
impl<T: Human + Animal> HasMouth for T { fn speak(&self) { <T as Human>::speak(self); } }
这样既满足了HasMouth特征的实现要求,又复用了Human中定义的默认行为。
内容的提问来源于stack exchange,提问作者Matias Cicero
相关产品推荐
相关产品推荐

