每日见闻之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
    }
}
相关推荐
冬奇Lab3 分钟前
相机录像流程:MediaRecorder与Camera2的协作之道
android·音视频开发·源码阅读
土豆12505 分钟前
Tauri 入门与实践:用 Rust 构建你的下一个桌面应用
前端·rust
土豆125012 分钟前
Rust 错误处理实战:anyhow + thiserror 的黄金搭档
rust
麦客奥德彪1 小时前
Jetpack Compose 常用开发总结
android
麦客奥德彪1 小时前
Jetpack Compose Modifier 完全指南
android
Zarek枫煜2 小时前
C3 编程语言 - 现代 C 的进化之选
c语言·开发语言·青少年编程·rust·游戏引擎
Mac的实验室3 小时前
(2026年最新)解决谷歌账号注册设备扫码短信发送失败无法验证难题(100%通过无需扫码验证)
android·google·程序员
半条咸鱼4 小时前
如何通过 ADB 连接安卓设备(USB + 无线 TCP/IP)
android
huwuhang4 小时前
斐讯盒子N1_YYFROM固件_webview119更新版附安卓专用遥控器刷机固工具USB_Burning_Tool
android
qq_352018684 小时前
android 状态栏高度获取
android