考虑以下示例:
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
但是,编译器应该知道我正在为任何实现
Human
的类型实现该特征,它提供了 speak
的实现,因此不需要在这里提供一个实现。
我在这里做错了什么吗?
Rust 编译器希望您在实现 HasMouth 特征时显式定义 talk 方法,即使 Human 特征提供了默认实现。出现问题的原因是 Rust 不会自动使用一个特征中方法的默认实现来满足另一个特征的要求。
为了使代码编译,您需要确保为 HasMouth 特征显式实现 Human 特征中的 talk 方法。但是,您可以通过使用 HasMouth 特征中的默认实现来解决此问题,该实现从 Human 特征中调用 talk 方法。
以下是调整代码的方法:
在 HasMouth 特征中定义 talk 方法的默认实现,将调用转发给 Human 特征。
为任何实现 Human 和 Animal 的类型实现 HasMouth 时,请使用该默认实现。
trait HasMouth {
fn speak(&self);
}
trait Animal: HasMouth {}
trait Human: Animal {
fn speak(&self) {
println!("Hey there! I'm a human!");
}
}
// Provide a default implementation for HasMouth that calls the speak method
from Human
impl<T: Human> HasMouth for T {
fn speak(&self) {
Human::speak(self);
}
}
struct Person;
impl HasMouth for Person {}
impl Animal for Person {}
impl Human for Person {}
fn main() {
let person = Person;
person.speak(); // This should print: "Hey there! I'm a human!"
}