error[E0277]: trait bound `my_struct::MyStruct: my_trait::MyTrait` 不满足

error[E0277]: the trait bound `my_struct::MyStruct: my_trait::MyTrait` is not satisfied

我正在用 Rust 编写项目来帮助我学习它,但是我在实现一个特征时遇到了问题,然后在将实现它的类型传递给函数时使用该特征所需的函数。

为了缩小问题范围,我创建了一个 MVCE。这是错误消息和代码:

错误信息

error[E0277]: the trait bound `my_struct::MyStruct: my_trait::MyTrait` is not satisfied
  --> src\main.rs:12:5
   |
12 |     invoke_print_i32(&MyStruct { });
   |     ^^^^^^^^^^^^^^^^ the trait `my_trait::MyTrait` is not implemented for `my_struct::MyStruct`
   |
note: required by `invoke_print_i32`
  --> src\main.rs:7:1
   |
7  | fn invoke_print_i32<T: MyTrait>(instance: &T) {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

my_trait.rs

pub trait MyTrait {
    fn print_i32(&self, n: i32);
}

my_struct.rs

#[path = "my_trait.rs"]
mod my_trait;
use my_trait::MyTrait;

pub struct MyStruct { }

impl MyTrait for MyStruct {
    fn print_i32(&self, n: i32) {
        println!("n: {}", n);
    }  
}

main.rs

mod my_trait;
use my_trait::MyTrait;

mod my_struct;
use my_struct::MyStruct;

fn invoke_print_i32<T: MyTrait>(instance: &T) {
    instance.print_i32(42);
}

fn main() {
    invoke_print_i32(&MyStruct { });
}

我研究这个问题的尝试主要是发现人们试图实现相当标准的 Rust 特性,例如:

我还在某处读到我需要为 &MyStruct 等变量重新实现特征,但我尝试这样做并没有解决问题。

额外信息

问题

我做错了什么;我怎样才能正确实现特征?

您已经声明模块 my_trait 两次,所以实际上有两个不同的特征称为 MyTraitcrate::my_traitcrate::my_struct::my_trait

不需要在my_struct模块中声明模块。相反,使用在板条箱根目录中声明的模块,其中:

use crate::my_trait::MyTrait;

use super::my_trait::MyTrait;