每日见闻之Rust中 trait 的孤儿规则

170 阅读1分钟

规则:为了不导致混乱,Rust 要求在一个模块中,如果要对一个类型实现某个 trait,这个类型和这个 trait 其中必须有一个是在当前模块中定义的。比如下面这两种情况都是可以的。

代码 1

use std::fmt::Display;

struct A;
impl Display for A {}

因为类型A在这个文件,所以可以给A实现trait Display

代码 2

trait TraitA {}
impl TraitA for u32 {}

因为trait TraitA 在这个文件 所以可以给u32实现 TraitA

代码 3

use std::fmt::Display;

impl Display for u32 {}

因为Display 跟 u32 的定义都不在这个文件所以不可以在这个文件 为u32实现 Display

解决这个问题可以使用newType 在这个文件声明MyU32(u32),用MyU32代表u32

use std::fmt::Display;

struct MyU32(u32);    // 用 MyU32 代替 u32

impl Display for MyU32 {
  // 请实现完整
}

impl MyU32 {
    fn get(&self) -> u32 {  // 需要定义一个获取真实数据的方法
        self.0
    }
}