每日见闻之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
    }
}
相关推荐
selt7915 小时前
Redisson之RedissonLock源码完全解析
android·java·javascript
Yao_YongChao6 小时前
Android MVI处理副作用(Side Effect)
android·mvi·mvi副作用
非凡ghost7 小时前
JRiver Media Center(媒体管理软件)
android·学习·智能手机·媒体·软件需求
席卷全城7 小时前
Android 推箱子实现(引流文章)
android
齊家治國平天下7 小时前
Android 14 系统中 Tombstone 深度分析与解决指南
android·crash·系统服务·tombstone·android 14
maycho1239 小时前
MATLAB环境下基于双向长短时记忆网络的时间序列预测探索
android
思成不止于此10 小时前
【MySQL 零基础入门】MySQL 函数精讲(二):日期函数与流程控制函数篇
android·数据库·笔记·sql·学习·mysql
brave_zhao10 小时前
达梦数据库(DM8)支持全文索引功能,但并不直接兼容 MySQL 的 FULLTEXT 索引语法
android·adb
sheji341610 小时前
【开题答辩全过程】以 基于Android的网上订餐系统为例,包含答辩的问题和答案
android
easyboot11 小时前
C#使用SqlSugar操作mysql数据库
android·sqlsugar