Rust 语言从入门到实战
唐刚
Rust 语言中文社区联合创始人
5266 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 36 讲
Rust 语言从入门到实战
15
15
1.0x
00:00/00:00
登录|注册

11|常见trait解析:标准库中的常见trait应该怎么用?

你好,我是 Mike,今天我们一起来学习 Rust 中的常见 trait。
前面两节课我们已经讲过 trait 在 Rust 中的重要性了,这节课就是 trait 在 Rust 标准库中的应用。Rust 标准库中包含大量的 trait 定义,甚至 Rust 自身的某些语言特性就是在这些 trait 的帮助下实现的。这些 trait 和标准库里的各种类型一起,构成了整个 Rust 生态的根基,只有了解它们才算真正了解 Rust。
注:这节课大量代码来自 Tour of Rust’s Standard Library Traits,我加了必要的注解和分析。
学习完这节课的内容,你会对很多问题都豁然开朗。下面就让我们来学习标准库里一些比较常用的 trait。

标准库中的常用 trait

Default

我们来看 Default trait 的定义以及对 Default trait 的实现和使用。
trait Default {
fn default() -> Self;
}
struct Color(u8, u8, u8);
impl Default for Color {
// 默认颜色是黑色 (0, 0, 0)
fn default() -> Self {
Color(0, 0, 0)
}
}
fn main() {
let color = Color::default();
// 或
let color: Color = Default::default();
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Rust标准库中的trait扮演着重要角色,包括Default、Display、ToString、Debug、PartialEq、Eq、PartialOrd、Ord、Clone、Copy、ToOwned、Deref、Drop、闭包相关trait、From、Into、TryFrom、TryInto、FromStr等。这些trait在Rust中扮演着重要的角色,了解它们有助于更好地理解和应用Rust语言。`AsRef<T>` trait的定义类似`AsRef<T>`的特点是将自身的引用转换成目标类型的引用,相对于`Deref`,`as_ref()`需要显式调用,使代码更清晰,减少出错机会。这些trait构成了Rust生态的基础,赋予Rust强大的表达力和灵活性。trait的设计使得新特性的添加不会对语言本身造成沉重的负担。通过学习这些trait,读者可以更深刻地理解Rust语言的强大之处。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 语言从入门到实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(9)

  • 最新
  • 精选
  • 飞了的鸭子被煮了
    asref: A 到 B, deref:B回到A

    作者回复: 🈶意思👍

    2024-01-27归属地:美国
    1
  • Zoom 6
    Deref 是重载了运算符,AsRef是做的类型转换

    作者回复: 👍

    2024-01-04归属地:江苏
    1
  • Luke
    Deref 和 AsRef<T> 是 Rust 中用于类型转换的 trait。 Deref trait 允许你重载解引用操作符 *,使得一个类型可以被像指针一样解引用。这样可以方便地访问类型内部的数据。当你对一个实现了 Deref trait 的类型使用解引用操作符时,编译器会自动调用 Deref trait 中的 deref 方法来获取对应的值。 AsRef<T> trait 则是用于将一个类型转换为另一个类型的引用。它提供了一个 as_ref 方法,该方法返回一个指向目标类型的引用。这在需要将一个类型转换为另一个类型的引用时非常有用,例如将字符串转换为字节切片。 总结一下区别: Deref trait 用于重载解引用操作符 *,使得一个类型可以被像指针一样解引用。 AsRef<T> trait 用于将一个类型转换为另一个类型的引用。 在使用上,如果你需要对一个类型进行解引用操作,你可以实现 Deref trait。如果你需要将一个类型转换为另一个类型的引用,你可以实现 AsRef<T> trait。

    作者回复: 👏

    2023-12-22归属地:上海
    1
  • 兰天白云
    老师,您在讲到from和into的时候,说“因为 into() 是方法,而 from() 是关联函数。”,而在trait声明里都是有返回值的呀?该怎样理解呢?

    作者回复: 方法由实例调用,用 . ,关联函数由类型调用,用 :: ,区别不在有没有返回值。

    2024-02-22归属地:海南
  • My dream
    能讲一下在trait中如何使用async fn吗?我还不会使用

    作者回复: 可以看看这篇. https://blog.rust-lang.org/inside-rust/2023/05/03/stabilizing-async-fn-in-trait.html 还有刚发布的稳定版本: https://blog.rust-lang.org/2023/12/28/Rust-1.75.0.html 用法跟单独写 async fn 现在是一样的.

    2023-12-30归属地:四川
  • superggn
    as_ref 没印象了, 找gpt4看了看, 总结了下核心就这俩: - implicit vs explicit - Deref trait 自动运行, `*T` 直接触发 deref(), 看起来像是隐式触发 - AsRef trait 需要显式调用 as_ref() - 功能不同(我看到这条的时候都愣了, 这谁不知道, 为撒还算是 key diff) - Deref 是解引用的 - AsRef 是创建引用的

    作者回复: 哈哈。gpt4有趣的。

    2023-12-15归属地:北京
  • 刘丹
    请问下面这一句,能否只写Ord和Eq?Ord是PartialOrd的超集, Eq是PartialEq的超集。 编译器应该可以判断出,已经实现了Ord和Eq,当然也肯定实现了PartialOrd和PartialEq。 #[derive(Ord, PartialOrd, PartialEq, Eq)] // 注意这一句,4个都写上

    作者回复: 不能,Rust编译器就是要让你多写一点。文中有说明类似的原因。主要是怕你滥用。

    2023-11-13归属地:广东
  • 杨赛军
    Deref 不能传递所有权变量,Asref可以传递所有权变量

    作者回复: 有这个意思在里面,Deref需要通过其它操作符隐式触发,如 &, . 等,并且做的是自动 & 操作。

    2023-11-13归属地:北京
  • superggn
    笔记 1. Deref trait => 给 typeA 实现了 Deref trait 之后就可以 *typeAinstance 了 2. deref coercion => 我们要对 obj_0 做一些事情的时候, 如果发现 obj_0 不适配, 就试一下 *obj_0, 看看它的 deref 是否适配, 如果适配, 就对 deref result 搞事, 如果不适配, 就继续找 deref, 直到当前 obj 没有 deref 为止
    2023-12-15归属地:北京
    2
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部