【quantity】5 derive_more库 2.0 版介绍

derive_more 是一个 Rust 过程宏库,旨在通过派生宏自动生成常见 trait 的实现,减少样板代码。2.0 版本带来了多项改进和新特性。

主要特性

1. 支持的 Trait 派生

derive_more 2.0 支持派生以下 trait:

基本操作 trait:
  • Display - 格式化显示

  • Debug - 调试输出

  • From/Into - 类型转换

  • FromStr - 从字符串解析

  • Index/IndexMut - 索引操作

  • Deref/DerefMut - 解引用操作

  • Constructor - 简化结构体构造

算术运算 trait:
  • Add/AddAssign - 加法

  • Sub/SubAssign - 减法

  • Mul/MulAssign - 乘法

  • Div/DivAssign - 除法

  • Rem/RemAssign - 取余

  • Neg - 取负

  • Not - 逻辑非

  • BitAnd/BitAndAssign - 按位与

  • BitOr/BitOrAssign - 按位或

  • BitXor/BitXorAssign - 按位异或

  • Shl/ShlAssign - 左移

  • Shr/ShrAssign - 右移

2. 2.0 版本新特性
  • 性能优化:减少了编译时间和生成的代码量

  • 更好的错误信息:更清晰的编译错误提示

  • 更灵活的配置:通过属性提供更多自定义选项

  • 支持更多 trait:新增了几个常用 trait 的派生支持

  • 改进的文档:更详细的文档和示例

使用示例

基本使用
use derive_more::{Display, From, Add};#[derive(Display, From, Add)]
struct MyInt(i32);let my_int = MyInt(10);
println!("{}", my_int); // 输出: 10
let sum = my_int + MyInt(20); // 可以使用加法
自定义显示格式
use derive_more::Display;#[derive(Display)]
#[display(fmt = "({}, {})", x, y)]
struct Point {x: i32,y: i32,
}println!("{}", Point { x: 1, y: 2 }); // 输出: (1, 2)
枚举支持
use derive_more::{Display, From};#[derive(Display, From)]
enum MyEnum {#[display(fmt = "Int: {}", _0)]Int(i32),#[display(fmt = "Float: {}", _0)]Float(f64),
}println!("{}", MyEnum::Int(10)); // 输出: Int: 10
println!("{}", MyEnum::Float(3.14)); // 输出: Float: 3.14
运算符重载
use derive_more::{Add, Mul};#[derive(Add, Mul, Clone, Copy)]
struct Vec2 {x: f64,y: f64,
}let v1 = Vec2 { x: 1.0, y: 2.0 };
let v2 = Vec2 { x: 3.0, y: 4.0 };
let sum = v1 + v2; // Vec2 { x: 4.0, y: 6.0 }
let product = v1 * v2; // Vec2 { x: 3.0, y: 8.0 }

配置选项

derive_more 提供了多种属性来自定义派生行为:

  • #[display(fmt = “…”)] - 自定义显示格式

  • #[from(forward)] - 转发 From 实现

  • #[from(skip)] - 跳过某些 From 实现

  • #[add(forward)] - 转发加法操作

  • #[mul(forward)] - 转发乘法操作

与标准库的比较

derive_more 相比手动实现或使用标准库的派生有以下优势:

  1. 减少样板代码:自动生成大量重复的 trait 实现

  2. 一致性:确保所有相关 trait 实现行为一致

  3. 灵活性:提供更多自定义选项

  4. 扩展性:支持标准库没有的 trait 组合

适用场景

  • 需要为自定义类型实现多个 trait 时

  • 需要快速原型开发时

  • 当 trait 实现逻辑相对简单直接时

  • 当需要确保一组相关 trait 实现一致时

注意事项

  • 对于复杂逻辑的 trait 实现,可能需要手动实现

  • 某些 trait 组合可能有冲突,需要注意编译错误

  • 生成的代码可能不如手动优化的代码高效

derive_more 2.0 通过提供更强大、更灵活的派生宏,显著简化了 Rust 中常见 trait 的实现工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/78145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站备份,网站数据备份的步骤

网站备份(尤其是网站数据备份)是保障业务连续性、防止数据丢失和应对安全威胁的关键措施。以下是系统化的备份步骤和实施建议,涵盖技术操作、策略规划及常见问题处理: 一、备份前的准备工作 明确备份范围 核心数据:…

OpenCV 图形API(72)图像与通道拼接函数-----根据指定的方式翻转图像(GMat)函数 flip()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 翻转一个2D矩阵,围绕垂直轴、水平轴或同时围绕两个轴。 该函数以三种不同的方式之一翻转矩阵(行和列的索引是从0开始的&a…

医生视角下转录组学的生物信息学分析

医生视角下转录组学的生物信息学分析 转录组学的生物信息学分析是医生解决临床与科研问题的有力工具。这里罗列医学转录组学相关的几个概念,从使用者(医生)的角度看待理解相关技术,为后续使用该技术说明临床和科研问题奠定基础。…

量子机器学习中的GPU加速实践:基于CUDA Quantum的混合编程模型探索

引言:量子机器学习的新范式 在量子计算与经典机器学习交叉融合的前沿领域,量子机器学习(Quantum Machine Learning, QML)正经历着革命性突破。然而,随着量子比特规模的增长和算法复杂度的提升,传统计算架构…

Matplotlib核心课程-2

4.1 数据加载、储存 4.1.1 从数据文件读取数据 导入支持库: import numpy as np from pandas import Series,DataFrame import pandas as pd 从csv文件读取数据,一般方法: pd.read_csv(../data/ex1.csv,encodinggbk) 从csv文件读取数据&#…

new和malloc的区别

1 语义层级不同:语言机制 vs. 库函数 new / new[] (C 关键字)malloc / calloc / realloc (C 运行时函数)本质语言级运算符;可被重载库函数;无法重载作用分配内存 并调用构造函数仅分配原始字节块,不做初始化,也不调用…

C++11新特性_自动类型推导_auto

在 C11 标准中,auto关键字被赋予了全新且强大的功能,它用于自动类型推导,即编译器能够根据变量的初始化表达式自动确定其类型。 基本语法 使用auto声明变量时,只需给出auto关键字,后面紧跟变量名,并对其进…

[预备知识]6. 优化理论(二)

优化理论 本章节介绍深度学习中的高级优化技术,包括学习率衰减、梯度裁剪和批量归一化。这些技术能够显著提升模型的训练效果和稳定性。 学习率衰减(Learning Rate Decay) 数学原理与可视化 学习率衰减策略的数学表达: 步进式…

【计算机视觉】语义分割:Mask2Former:统一分割框架的技术突破与实战指南

深度解析Mask2Former:统一分割框架的技术突破与实战指南 技术架构与创新设计核心设计理念关键技术组件 环境配置与安装指南硬件要求安装步骤预训练模型下载 实战全流程解析1. 数据准备2. 配置文件定制3. 训练流程4. 推理与可视化 核心技术深度解析1. 掩膜注意力机制…

数字智慧方案5857丨智慧机场解决方案与应用(53页PPT)(文末有下载方式)

资料解读:智慧机场解决方案与应用 详细资料请看本解读文章的最后内容。 随着科技的飞速发展,智慧机场的建设已成为现代机场发展的重要方向。智慧机场不仅提升了旅客的出行体验,还极大地提高了机场的运营效率。本文将详细解读沃土数字平台在…

【C到Java的深度跃迁:从指针到对象,从过程到生态】第五模块·生态征服篇 —— 第二十章 项目实战:从C系统到Java架构的蜕变

一、跨语言重构:用Java重写Redis核心模块 1.1 Redis的C语言基因解析 Redis 6.0源码核心结构: // redis.h typedef struct redisObject { unsigned type:4; // 数据类型(String/List等) unsigned encoding:4; // …

ES6异步编程中Promise与Proxy对象

Promise 对象 Promise对象用于解决Javascript中的地狱回调问题,有效的减少了程序回调的嵌套调用。 创建 如果要创建一个Promise对象,最简单的方法就是直接new一个。但是,如果深入学习,会发现使用Promise下的静态方法Promise.re…

UE自动索敌插件Target System Component

https://www.fab.com/zh-cn/listings/9088334d-3bde-4e10-a937-baeb780f880f ​ 一个完全用 C 编写的 UE插件,添加了对简单相机锁定/瞄准系统的支持。它最初​​在蓝图中开发和测试,然后转换并重写为 C 模块和插件。 特征: 可通过一组可在…

中小企业MES系统概要设计

版本:V1.0 日期:2025年5月2日 一、系统架构设计 1.1 整体架构模式 采用分层微服务架构,实现模块解耦与灵活扩展,支持混合云部署: #mermaid-svg-drxS3XaKEg8H8rAJ {font-family:"trebuchet ms",verdana,ari…

STM32移植U8G2

STM32 移植 U8G2 u8g2 (Universal 8bit Graphics Library version2 的缩写)是用于嵌入式设备的单色图形库,可以在单色屏幕中绘制 GUI。u8g2 内部附带了例如 SSD13xx,ST7xx 等很多 OLED,LCD 驱动。内置多种不同大小和风…

Langchain,为何要名为langchian?

来听听 DeepSeek 怎么说 Human 2025-05-02T01:13:43.627Z langchain 是一个大语言模型开发框架。我的理解中,lang 是词根"语言",chain是单词"链",langchain 便是将语言模型和组件串联成链的框架。而 langchain 的图标是…

Windows下Python3脚本传到Linux下./example.py执行失败

1. 背景 大多数情况下通过pycharm编写Python代码,编写调试完,到Linux下发布执行。 以example.py脚本为例 #! /usr/bin/env python3 #! -*- encoding: utf-8 -*- def test(x,y): xint x yint y cxy return c if _name_"__main__": print(test(2…

当MCP撞进云宇宙:多芯片封装如何重构云计算的“芯“未来?

当MCP撞进云宇宙:多芯片封装如何重构云计算的"芯"未来? 2024年3月,AMD发布了震撼业界的MI300A/B芯片——这颗为AI计算而生的"超级芯片",首次在单封装内集成了13个计算芯片(包括3D V-Cache缓存、CDNA3 GPU和Zen4 CPU),用多芯片封装(Multi-Chip Pac…

用定时器做微妙延时注意事项

注意定时器来着APB1还是APB2,二者频率不一样,配置PSC要注意 (1)高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线 (2)通用定时器ti…

三类思维坐标空间与时空序位信息处理架构

三类思维坐标空间与时空序位信息处理架构 一、静态信息元子与元组的数据结构设计 三维思维坐标空间定义 形象思维轴(x):存储多媒体数据元子(图像/音频/视频片段) 元子结构:{ID, 数据块, 特征向量, 语义…