Rust 实用工具特型

Rust 实用工具特型可分为三大类。

  • 语言扩展特型
  • 标记特型
  • 公共词汇特型

Drop

当一个值的拥有者消失时,Rust 会丢弃(drop)该值。

struct Car {
    money: i32,
}

impl std::ops::Add for Car {
    type Output = i32;

    fn add(self, other: Car) -> i32 {
        self.money + other.money
    }
}

impl Drop for Car {
    fn drop(&mut self) {
        println!("Car {} is dropped", self.money);
    }
}

fn main() {
    let car1 = Car { money: 1000 };
    let car2 = Car { money: 2000 };
    println!("Car money: {}", car1 + car2);
}

//输出结果
//Car 2000 is dropped
//Car 1000 is dropped
//Car money: 3000

Sized

固定大小类型是指其每个值在内存中都有相同大小的类型。

Rust 自动为所有适用的类型实现了 std::marker::Sized 特型,你不能自己实现它。

Clone

std::clone::Clone 特型适用于可复制自身的类型。clone 方法应该为 self 构造一个独立的副本并返回它。

trait Clone: Sized {
    fn clone(&self) -> Self;
    fn clone_from(&mut self, source: &Self) {
        *self = source.clone()
    }
}

Copy

对于大多数类型,赋值时会移动值,而不是复制它们,如果一个类型实现了 std::marker::Copy 标记特型,那么它就是 Copy 类型.

[!IMPORTANT]

任何实现了 Drop 特型的类型都不能是 Copy 类型。

trait Copy: Clone { }

impl Copy for MyType { }

Deref 与 DerefMut

通过实现 std::ops::Deref 特型和 std::ops::DerefMut 特型,可以指定像 * 和 . 这样的解引用运算符在你的类型上的行为。

附件

实用工具特型汇总表

特型 描述
Drop 析构器。每当丢弃一个值时,Rust 都要自动运行的清理代码
Sized 具有在编译期已知的固定大小类型的标记特型,与之相对的是动态大小类型(如切片)
Clone 用来支持克隆值的类型
Copy 可以简单地通过对包含值的内存进行逐字节复制以进行克隆的类型的标记特型
Deref DerefMut 智能指针类型的特型
Default 具有合理“默认值”的类型
AsRef AsMut 用于从另一种类型中借入一种引用类型的转换特型
Borrow BorrowMut 转换特型,类似 AsRef/AsMut,但能额外保证一致的哈希、排序和相等性
From Into 用于将一种类型的值转换为另一种类型的转换特型
TryFrom TryInto 用于将一种类型的值转换为另一种类型的转换特型,用于可能失败的转换
ToOwned 用于将引用转换为拥有型值的转换特型