Rust 编程视频教程(进阶)——026_2 高级 trait2

视频地址

头条地址:https://www.ixigua.com/i6775861706447913485
B站地址:https://www.bilibili.com/video/av81202308/

源码地址

github地址:https://github.com/anonymousGiga/learn_rust

讲解内容

默认泛型类型参数和运算符重载
(1)使用泛型类型参数时,可以为泛型指定一个默认的具体类型。
(2)运算符重载是指在特定情况下自定义运算符行为的操作。Rust并不允许创建自定义运算符或者重载运算符,不过对于std::ops中列出的运算符和相应的trait,我们可以实现运算符相关trait来重载。
(3)示例
a、例子:

use std::ops::Add;
#[derive(Debug, PartialEq)]
struct Point {
    x: i32,
    y: i32,
}
impl Add for Point {
    type Output = Point;
    fn add(self, other: Point) -> Point {
        Point {
            x: self.x + other.x,
            y: self.y + other.y,
        }
    }
}
fn main() {
    assert_eq!(Point { x: 1, y: 0 } + Point { x: 2, y: 3 },
        Point { x: 3, y: 3 });
}

b、Add trait 的定义如下:

trait Add<RHS=Self> { 
    type Output; 
    fn add(self, rhs: RHS) -> Self::Output; 
}

说明:

尖括号中的 RHS=Self,这个语法叫做 默认类型参数(default type parameters)。RHS 是一个泛型类型参数(“right hand side” 的缩写),它用于定义 add 方法中的 rhs 参数。如果实现 Add trait 时不指定 RHS 的具体类型,RHS 的类型将是默认的 Self 类型,上面的例子就是在默认类型上实现的 Add 的类型。

自定义RHS的例子:

use std::ops::Add; 
struct Millimeters(u32); 
struct Meters(u32); 
impl Add<Meters> for Millimeters { 
    type Output = Millimeters; 
    fn add(self, other: Meters) -> Millimeters {    
        Millimeters(self.0 + (other.0 * 1000))
    }
}

默认参数类型主要用于如下两个方面:

  • 扩展类型而不破坏现有代码。
  • 在大部分用户都不需要的特定情况进行自定义。

推荐阅读更多精彩内容