rust 教程 07 核心trait介绍

news/2025/3/24 18:48:49/文章来源:https://www.cnblogs.com/xwher/p/18786316

Rust 核心 Trait 详解

1. Drop

作用: 自定义值离开作用域时的清理逻辑
Trait 定义:

pub trait Drop {fn drop(&mut self);
}

关键点:
• 自动调用,无法手动触发(可用 std::mem::drop 强制提前释放)
• 用于释放资源(如文件句柄、网络连接)
• 实现了 Drop 的类型不能实现 Copy
示例:

struct Resource;
impl Drop for Resource {fn drop(&mut self) { println!("资源释放!"); }
}

2. Sized

作用: 标记类型在编译期已知大小
Trait 特性:
• 隐式自动实现(如 i32, struct
• 未实现类型:[T](切片)、strdyn Trait
特殊用法:

fn generic<T: ?Sized>(t: &T) {} // 允许接受未定长类型

3. Clone vs Copy

Trait 区别 使用场景 示例
Clone 显式深拷贝 (x.clone()) 需资源复制的复杂类型 String, Vec<T>
Copy 隐式位复制(自动复制) 简单值类型 i32, f64, 元组(全 Copy)

代码示例:

#[derive(Clone, Copy)]
struct Point { x: i32, y: i32 } // 必须同时实现 Clone

4. Deref / DerefMut

作用: 重载解引用操作符 *.
Trait 定义:

pub trait Deref {type Target: ?Sized;fn deref(&self) -> &Self::Target;
}

关键机制:
Deref Coercion:自动转换链(如 &Box<String>&String&str
• 常用于智能指针(Box<T>, Rc<T>
示例:

struct MyBox<T>(T);
impl<T> Deref for MyBox<T> {type Target = T;fn deref(&self) -> &T { &self.0 }
}

5. Default

作用: 提供类型的默认值
Trait 方法:

pub trait Default {fn default() -> Self;
}

实用场景:
• 结构体更新语法:Config { timeout: 5, ..Default::default() }
• 泛型约束中初始化类型
可派生:

#[derive(Default)]
struct Config { timeout: u32 }

6. 引用转换 Trait

Trait 作用 方法 典型实现
AsRef<T> 不可变引用转换 as_ref() String&str
AsMut<T> 可变引用转换 as_mut() Vec<T>&mut [T]
Borrow<T> 借用语义等价转换 borrow() String&str
BorrowMut<T> 可变借用语义等价转换 borrow_mut() Vec<T>&mut [T]

关键区别:
Borrow 要求哈希/比较行为与原类型一致
AsRef 用于通用引用转换,无行为一致性要求


7. 类型转换 Trait

(1) 无错误转换

Trait 方向 方法 示例
From<T> T → Self from() String::from("hi")
Into<T> Self → T into() let s: String = "hi".into();

(2) 可能失败的转换

Trait 错误处理 方法 典型场景
TryFrom<T> 返回 Result try_from() 数值类型窄化转换
TryInto<T> 返回 Result try_into() 字符串解析为数字

关系:
Into 自动实现当 From 存在时
TryInto 自动实现当 TryFrom 存在时


8. ToOwned

作用: 从借用数据创建拥有所有权的副本(泛化的 Clone
Trait 定义:

pub trait ToOwned {type Owned: Borrow<Self>;fn to_owned(&self) -> Self::Owned;
}

Clone 区别:
Clone 直接返回 SelfToOwned 可返回不同但能 Borrow<Self> 的类型
经典案例:

let s: &str = "hello";
let owned: String = s.to_owned(); // &str → String

核心 Trait 总结表

Trait 主要作用 关键方法/机制
Drop 资源清理 自动调用 drop()
Sized 标记编译期已知大小 隐式实现
Clone/Copy 复制语义 clone() / 隐式复制
Deref/Mut 重载解引用操作符 Deref Coercion 机制
Default 默认值初始化 default()
AsRef/Mut 通用引用转换 as_ref(), as_mut()
Borrow/Mut 语义等价借用 HashMap 的键查找
From/Into 无错误类型转换 from(), into()
TryFrom/Into 可能失败的类型转换 try_from(), try_into()
ToOwned 创建所有权副本 to_owned()

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

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

相关文章

初入博客园

Start 第一篇随笔记录一下对于博客园的便利使用技巧。 自定义皮肤 安装和配置博客园皮肤全称按照了guangzan大佬的说明教程。[1] 里面附带有一有获取音乐链接以及歌词的网站,感觉很有用😍;[2] 贴一个网站头部背景图(苹果初代机-麦金塔Macintosh):待更新 🍀🍀🍀htt…

PCIe总线-RK3588 PCIe平台驱动分析

1.简介 RK3588 PCIe RC和EP使用同一个平台驱动,其主要的作用是解析设备树中的资源、初始化中断、使能电源、初始化PHY、使能时钟和释放复位,然后根据compatible属性初始化RC或者EP驱动。 2.入口 平台驱动的定义如下,当compatible属性为"rockchip,rk3588-pcie",则…

202413350081刁嘉怡博客园2

TASK11 #include <stdio.h>2 #include <stdlib.h>3 #include <time.h>4 5 #define N 56 7 int main() {8 int number;9 int i; 10 11 srand(time(0)); // 以当前系统时间作为随机种子 12 for(i = 0; i < N; ++i) { 13 numbe…

四则运算结对项目

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023这个作业的目标 结对合作生成一个四则运算题目生成器结对成员 3123004365彭颂华 &&3123004354黄子恒github地址 https://github.com/PShua/zuoye &&https://github.c…

Vue3 vite 集成 sass

一、安装依赖npm install sass-embedded二、配置全局变量 1、新建文件 src/styles/variables.scss 2、配置Vite 修改 vite.config.jscss: {preprocessorOptions: {scss: {additionalData: `@use "@/styles/variables" as *;`,},},},3、测试使用 a、在variables.scss…

在Android studio 里面想要写入文本内容怎么做

在 AndroidManifest.xml 文件中添加写入外部存储的权限。如果是 Android 6.0(API 级别 23)及以上的系统,还需要在运行时请求权限。在 MainActivity 的 writeToFile 方法里调用 FileHelper 类: private void writeToFile(String content) { FileHelper.writeToInternalStora…

iptables 介绍与实战

iptables是Linux内核中用于配置防火墙规则的工具。它基于Netfilter框架,可以对通过网络接口的数据包进行过滤、修改等操作。通过设置一系列规则,iptables能够控制哪些数据包可以进入或离开系统,从而实现网络安全防护等功能。它主要工作在网络层,能够根据数据包的源地址、目…

CF771E题解

CF771E题解很容易设出 \(dp_{i,j}\) 表示第一行选到 \(i\),第二行选到 \(j\) 的方案数 首先考虑部分分。 \(|a_i|\le 1\),那么产生贡献的一个矩阵不会超过 \(2\),那么就没必要考虑 \(|i-j|\ge 4\) 的状态了。证明如下: 不妨设 \(i<j\),那么我与其从 \(dp_{i,j}\to dp_{…

Word目录链接中只选中开头的文字

Word目录链接中只选中开头的文字 Word目录想选第一个字却选中整行 word自动生成目录里选中第一个字不是选整段就是选一行,怎么解决解决方法: 【不行】按上档键Shift+Home键。 【不行】Windows有个很强大的Alt健,按住Alt之后,在目录里面就可以想选哪个选哪个,不会出现再你这…

基于MPPT控制的锂离子电池充电器

基于MPPT的集成电路,可跟踪电源点并对电池充电,最大额定功率为1A,外形尺寸为TP4056。当谈到独立的单电池充电器时,只有一个流行的名字进入我的脑海,那就是我们的多功能锂离子/锂po TP4056电池充电器。这是广泛使用的,有很多功能与电池保护有关。锂电池在市场上很容易获得…

【Linux文件】把/etc/passwd删除了,该怎么办?

场景: 在做渗透测试发现网站存在任意文件删除漏洞,测试删除了/etc/passwd,那么删除后该如何恢复?一、 /etc/passwd文件的作用 /etc/passwd 是 Linux 系统中存储用户账户信息的关键文件,包含用户名、UID、GID、主目录路径和默认 Shell 等。删除 /etc/passwd 仍会导致以下问题…

20244210 实验一《Python程序设计》实验报告

20244210 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级:2442 姓名: 陈可 学号:20244210 实验教师:王志强 实验日期:2024年3月18日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习变…