当前位置: 首页 > news >正文

Rust 设计模式 Marker Trait + Blanket Implementation

如果一个 Trait 要被多种 struct 实现,其中某几个或某一类 struct 对这个 trait 的实现方式一样,就可以用到 Marker Trait 这种设计模式。开源的做虚拟机模块化的 vm-memory 仓库就用到了这种技巧。

/// 普通的实现方式
struct MyRegion { /* ... */ }// 😭 必须手动实现所有 Bytes 的方法
impl Bytes<MemoryRegionAddress> for MyRegion {fn write(&self, buf: &[u8], addr: MemoryRegionAddress) -> Result<usize> {let maddr = addr.raw_value() as usize;self.as_volatile_slice()?.write(buf, maddr).map_err(Into::into)}fn read(&self, buf: &mut [u8], addr: MemoryRegionAddress) -> Result<usize> {let maddr = addr.raw_value() as usize;self.as_volatile_slice()?.read(buf, maddr).map_err(Into::into)}fn write_slice(&self, ...) { /* ... */ }fn read_slice(&self, ...) { /* ... */ }fn read_volatile_from(&self, ...) { /* ... */ }// ... 还有 4-5 个方法要写
}/// 😁 用上 Marker Trait
pub trait MemoryRegionBytes {}impl<R: MemoryRegionBytes> Bytes<MemoryRegionAddress> for R {// ← 为所有实现了 GuestMemoryRegionBytes 的类型//   自动提供 Bytes 的默认实现!fn write(&self, buf: &[u8], addr: MemoryRegionAddress) -> Result<usize> {let maddr = addr.raw_value() as usize;self.as_volatile_slice()?    // ← 调用 GuestMemoryRegion 的方法.write(buf, maddr).map_err(Into::into)}fn read(&self, buf: &mut [u8], addr: MemoryRegionAddress) -> Result<usize> {let maddr = addr.raw_value() as usize;self.as_volatile_slice()?.read(buf, maddr).map_err(Into::into)}// ... 其他 6-7 个方法都自动实现了
}impl MemoryRegionBytes for MyRegion {}

http://www.dtcms.com/a/499085.html

相关文章:

  • 在 MacOS Tahoe 上使用VMware虚拟机安装 ARM版 Windows11
  • 苏州手机网站建设报价下载好的字体怎么安装到wordpress
  • 品牌出海进入精细化阶段,全球业财一体化成为系统选型关键
  • K8S(十二)—— Kubernetes安全机制深度解析与实践:从认证到RBAC授权
  • 【Zephyr存储专题】16_内存泄露检测可视化脚本自动化
  • 云服务器怎么建网站wordpress 仿 主题下载
  • 怎么搭建手机网站m国内最近重大新闻2024
  • 企业微信ipad协议接口优势
  • AI协同编程架构师如何解决技术债问题
  • 官方网站下载打印机驱动网站服务商
  • 解决部分程序中文乱码的问题
  • 三次到达:理解二叉树非递归遍历
  • AI驱动的专业报告撰写:从信息整合到洞察生成的全新范式
  • JVM(Java虚拟机)~
  • 南充网站建设略奥网络地宝网招聘信息网
  • mmdetection训练 测试步骤
  • 【基础算法】01BFS
  • Openharmony应用开发之Ability异常退出与UIAbility数据备份开发实战
  • 我做了一个免费的 DeepResearch 网站,让科研变得更简单
  • 顺德大良那里做网站好福建省城乡和住房建设厅网站
  • 前端+AI:CSS3(二)
  • go邮件发送——附件与图片显示
  • AI+若依框架(基础篇)
  • 机器学习(2) 线性回归和代价函数
  • 基于Ollama和sentence-transformers,通过RAG实现问答式定制化回复
  • Sentinel:阿里云高并发流量控制
  • 从技术到商业:电商返利平台的核心指标设计(GMV、佣金率、留存率)与技术支撑体系
  • ShardingSphere 源码解析之分片引擎(下)
  • winxp下做网站网店设计美工培训
  • 【论文学习】大语言模型(LLM)论文