每日见闻之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
    }
}
相关推荐
coderhuo1 天前
JibarOS 简介:Android AICore 开源实现方案
android·ai编程
故渊at1 天前
第十五板块:Android 系统调试与逆向工程 | 第三十六篇:Smali 字节码语义与 Dalvik 指令集
android·指令集·dalvik·smali·字节码语义
J2虾虾1 天前
Android支持Java语言的标准
android·java·开发语言
charlee441 天前
Unity在安卓端如何调试输出信息
android·unity·adb·游戏引擎·真机调试
法欧特斯卡雷特1 天前
从 Kotlin 编译器 API 的变化开始: 2.4.0
android·开源·github
贾艺驰1 天前
实战Android Framework: 新增一个系统服务
android·源码
火山上的企鹅1 天前
Codex实战:APP远程升级服务搭建(五)App端远程升级接入
android·服务器·远程升级·qgc
BreezeDove1 天前
【Android】Flutter3.35项目启动超时问题
android·flutter
故渊at1 天前
第十四板块:Android 硬件抽象与安全加固 | 第三十四篇:Hardware Composer (HWC) 与 显示安全(HDCP)
android·安全·composer·安全加固·hwc·硬件抽象
KIO no way1 天前
AI内容编排是什么_聊聊CSDN_AI数字营销背后的分发逻辑
android·人工智能