Rust: 泛型,特征与特征对象
Rust: 泛型,特征与特征对象 最近在学习 Rust 的一些概念思想,记录一下自己对 Rust 中泛型,特征与特征对象的理解。 泛型 泛型与 CPP 中的模版类似,可以减少代码的重复。泛型会在编译时实现单态化(monomorphization),会将通用代码转换为特定代码,因此不会出现运行时开销。 可以理解为编译器帮你把写的泛型代码重新转换为写了具体类型的代码。 泛型可以用在结构体,枚举,函数乃至方法中,其中枚举和方法可以多讲一下。 泛型在枚举中的实现 泛型在枚举中的实现本身没有要讲的,不过标准库实现的Option<T>和Result<T, E>很想讲一下。 Option 标准库中的泛型定义 pub enum Option<T> { None, Some(T), } 简约而又简单,rust 中并不存在空指针,通过 None 进行替代,Option常使用在返回值中。当返回值可能为一个结果,也有可能失败或缺值时,可以通过模式匹配进行处理。这里的 T 就是泛型说明 Result<T, E> 标准库中的泛型定义 pub enum Result<T, E> { Ok(T), Err(E), } 除了Option可以在结果失败时传递 None,但有时我们想要知道具体的失败信息,Result 实现了这一点。Result<T, E> 拥有两个泛型 T 和 E,在不同的场景下你可以将他们作为不同的类型。 泛型在方法中 泛型在方法中需要在impl后面声明<T>,这里是为了告诉 Rust 类型后面的 T 是一个泛型而不是具体类型,注意这里impl后面提供的泛型声明只与后面具体类型要实现的泛型有关。 与之相应的,你也可以为一个泛型实现他具体类型的方法。 // 对一个泛型实现具体方法,其中方法中又提供了更多的泛型声明 struct Mix<T, U> { x: T, y: U, } impl<T, U> Mix<T, U> { fn mixup<V, W>(self, other: Mix<V, W>) -> Mix<T, W> { //这里提供了另外两个泛型: V和W, 代表other的类型参数 Mix { x: self....