每日见闻之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
    }
}
相关推荐
云上凯歌17 分钟前
02 Spring Boot企业级配置详解
android·spring boot·后端
hqiangtai26 分钟前
Android 高级专家技术能力图谱
android·职场和发展
aqi0037 分钟前
FFmpeg开发笔记(九十七)国产的开源视频剪辑工具AndroidVideoEditor
android·ffmpeg·音视频·直播·流媒体
小白路过38 分钟前
node-sass和sass兼容性使用
前端·rust·sass
stevenzqzq1 小时前
Android Koin 注入入门教程
android·kotlin
peterfei1 小时前
AI 把代码改崩溃了?若爱 (IfAI) v0.2.7 发布:程序员的“后悔药”真的来了!
rust·ai编程
TDengine (老段)1 小时前
TDengine Rust 连接器进阶指南
大数据·数据库·物联网·rust·时序数据库·tdengine·涛思数据
炼金术1 小时前
SkyPlayer v1.1.0 - 在线视频播放功能更新
android·ffmpeg
用户276038157811 小时前
鲲鹏+昇腾:开启 AI for Science 新范式——基于PINN的流体仿真加速实践
android
superman超哥1 小时前
Rust 或模式(Or Patterns)的语法:多重匹配的优雅表达
开发语言·后端·rust·编程语言·rust或模式·or patterns·多重匹配