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
等变量重新实现特征,但我尝试这样做并没有解决问题。
额外信息
rustc -V
输出 rustc 1.36.0 (a53f9df32 2019-07-03)
cargo -V
输出 cargo 1.36.0 (c4fcfb725 2019-05-15)
- Platform/OS 是 Windows 10 专业版 (x86_64)
问题
我做错了什么;我怎样才能正确实现特征?
您已经声明模块 my_trait
两次,所以实际上有两个不同的特征称为 MyTrait
:crate::my_trait
和 crate::my_struct::my_trait
。
不需要在my_struct
模块中声明模块。相反,使用在板条箱根目录中声明的模块,其中:
use crate::my_trait::MyTrait;
或
use super::my_trait::MyTrait;
我正在用 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
等变量重新实现特征,但我尝试这样做并没有解决问题。
额外信息
rustc -V
输出rustc 1.36.0 (a53f9df32 2019-07-03)
cargo -V
输出cargo 1.36.0 (c4fcfb725 2019-05-15)
- Platform/OS 是 Windows 10 专业版 (x86_64)
问题
我做错了什么;我怎样才能正确实现特征?
您已经声明模块 my_trait
两次,所以实际上有两个不同的特征称为 MyTrait
:crate::my_trait
和 crate::my_struct::my_trait
。
不需要在my_struct
模块中声明模块。相反,使用在板条箱根目录中声明的模块,其中:
use crate::my_trait::MyTrait;
或
use super::my_trait::MyTrait;