首页 > 其他分享 >Rust中为外部类型实现外部trait

Rust中为外部类型实现外部trait

时间:2024-07-11 10:31:28浏览次数:14  
标签:mut String 外部 trait fmt StringWrapper fn Rust

由于孤儿规则 (orphan rule) 的限制,在Rust中无法直接为外部类型实现外部trait。但是我们可以通过构造一个外部类型的wrapper来间接实现这个目的。

一个比较常见的使用情形是,外部类型并没有实现Display trait,而我们想为其实现。这里,我们以标准库中的String为例进行介绍。

extern crate std;

use std::fmt;
use std::ops::{Deref, DerefMut};
use std::string::String;

// 这个wrapper本质上是一个类似于`Box`但是只针对`String`
// 的智能指针
pub struct StringWrapper(String);

impl From<&str> for StringWrapper {
    // 针对不同类型的不包含self输入的方法需要分别自行重新实现
    pub fn from(source: &str) -> Self {
        StringWrapper(String::from(source))
    }
}

impl fmt::Display for StringWrapper {
    // 实现`Display` trait
    pub fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "I am a String: {}", self.0)
    }
}

// 分别利用`Deref`和`DerefMut`两个trait重载`StringWrapper`的
// 解引用操作。使得针对`&StringWrapper`调用的方法实际上指向了
// `&StringWrapper.0`也就是内部`String`。
impl Deref for StringWrapper {
    type Target = String;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

impl DerefMut for StringWrapper {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.0
    }
}

fn main() {
    let a = StringWrapper::from("123");
    println!("{}", a);
}

标签:mut,String,外部,trait,fmt,StringWrapper,fn,Rust
From: https://www.cnblogs.com/flyingicedragon/p/18295513

相关文章

  • Rust中 String、str、&str、char 的区别
    先上结论String是动态分配在堆上的可变长度字符串类型。str是字符串切片类型,通常以&str的形式出现,用于引用字符串字面量或String的一部分。&str是字符串字面量的类型,以双引号创建,通常用于传递字符串数据的引用。char是单个Unicode字符类型,以单引号创建,用于表示单个......
  • 51单片机嵌入式开发:7、 STC89C52RC 外部中断INT0和INT1 操作
    STC89C52RC外部中断INT0和INT1操作1外部中断1.1外部中断1.2中断介绍2STC89C52外部中断2.1外部中断引脚2.2外部中断寄存器说明3STC89C52外部中断演示3.1电平触发外部中断3.2边沿触发外部中断3.3Protues仿真4外部中断总结1外部中断1.1外部中断单片......
  • 如何在 Rust 中安全地处理 Openresty中的字符串?
    HelloWorldRust以简洁高效安全而闻名,那么我们怎么集成到C的项目中呢。尤其是字符串数据结构,该如何正确地交互。借此机会整理一下工作中遇到的难题,希望可以帮助大家走出坑。我们先回顾一下C中字符串的结构。在C语言中,字符是一个连续的内存地址空间以\0结尾。C语言的......
  • 面壁智能发布端侧 AI 应用开发平台;快手推出肖像动画技术 LivePortrait丨 RTE 开发者日
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点,......
  • 详解 | 什么是GeoTrust
    GeoTrust是一家全球知名的数字证书颁发机构(CertificateAuthority,简称CA),专注于提供SSL/TLS证书和其他相关的网络安全产品。1、历史背景:GeoTrust成立于2001年,最初作为一个独立的公司运营。2006年,GeoTrust被VeriSign收购。后来,在2010年,VeriSign的SSL业务又被Symantec收购。而现......
  • rust线程池
    #![allow(unused)]usestd::sync::{mpsc,Arc,Mutex};usestd::thread;//定义消息类型,可以是新任务或终止信号enumMessage{NewJob(Job),Terminate,}//定义线程池结构体pubstructThreadPool{workers:Vec<Worker>,//sender:mpsc::Sender<J......
  • tauri + vue3 如何实现在一个页面上局部加载外部网页?
    ......
  • Rust变量绑定
    变量绑定Rust通过静态类型确保类型安全。变量绑定可以在声明时说明类型,不过在多数情况下,编译器能够从上下文推导出变量的类型,从而大大减少了类型说明的工作。使用let绑定操作可以将值(比如字面量)绑定(bind)到变量。fnmain(){letan_integer=1u32;leta_boo......
  • Rust简明教程第九章-多线程和并发
    并发并发指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果进程是一个程序的实例线程是一个进程中执行的一个单一线性执行流程,一个进程包含多个线程,线程可以并发执行main是主线程,系统的入口区别:并发指一个系统能够......
  • 在windows中把mysql8.0.3设置为允许外部ip访问
    在windows中把mysql8.0.3设置为允许外部ip访问要在Windows系统中设置MySQL8.0.3允许外部IP访问,你需要按照以下步骤操作:登录到MySQL首先,你需要使用管理员账号登录到MySQL:mysql-uroot-p输入密码后,你将进入MySQL命令行界面。2.更新用户权限接下来,你需要更新......