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

规则:为了不导致混乱,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
    }
}
相关推荐
爱学习的大牛1231 小时前
MVVM 架构 android
android·mvvm
alexhilton3 小时前
理解retain{}的内部机制:Jetpack Compose中基于作用域的状态保存
android·kotlin·android jetpack
꒰ঌ 安卓开发໒꒱4 小时前
Mysql 坏表修复
android·mysql·adb
_李小白4 小时前
【Android Gradle学习笔记】第八天:NDK的使用
android·笔记·学习
袁震5 小时前
Android-Compose 列表组件详解
android·recyclerview·compose
2501_916007476 小时前
提升 iOS 26 系统流畅度的实战指南,多工具组合监控
android·macos·ios·小程序·uni-app·cocoa·iphone
WujieLi6 小时前
初识 Vite+:一文了解 Rust 驱动的新一代前端工具链
javascript·rust·vite
zh_xuan6 小时前
android 利用反射和注解绑定控件id和点击事件
android·注解·反射·控件绑定
std860217 小时前
Rust 与 Python – 这是未来的语言吗?
开发语言·python·rust
这个杀手不太累8 小时前
Android ProcessLifecycleOwner
android·lifecycle