规则:为了不导致混乱,Rust 要求在一个模块中,如果要对一个类型实现某个 trait,这个类型和这个 trait 其中必须有一个是在当前模块中定义的。比如下面这两种情况都是可以的。
代码 1
js
use std::fmt::Display;
struct A;
impl Display for A {}
因为类型A在这个文件,所以可以给A实现trait Display
代码 2
js
trait TraitA {}
impl TraitA for u32 {}
因为trait TraitA 在这个文件 所以可以给u32实现 TraitA
代码 3
js
use std::fmt::Display;
impl Display for u32 {}
因为Display 跟 u32 的定义都不在这个文件所以不可以在这个文件 为u32实现 Display
解决这个问题可以使用newType 在这个文件声明MyU32(u32),用MyU32代表u32
js
use std::fmt::Display;
struct MyU32(u32); // 用 MyU32 代替 u32
impl Display for MyU32 {
// 请实现完整
}
impl MyU32 {
fn get(&self) -> u32 { // 需要定义一个获取真实数据的方法
self.0
}
}