Rust中为外部类型实现外部trait
由于孤儿规则 (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);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」