缺少特征实现,即使有一个

问题描述 投票:0回答:1

考虑以下示例:

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
1个回答
0
投票

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!"
}
© www.soinside.com 2019 - 2024. All rights reserved.