Rust 程式設計視訊教程(進階)——026_2 高階 trait2

linghuyichong發表於2020-02-20

頭條地址:https://www.ixigua.com/i677586170644791348...
B站地址:https://www.bilibili.com/video/av81202308/

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

預設泛型型別引數和運算子過載
(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))
    }
}

預設引數型別主要用於如下兩個方面:

  • 擴充套件型別而不破壞現有程式碼。
  • 在大部分使用者都不需要的特定情況進行自定義。
本作品採用《CC 協議》,轉載必須註明作者和本文連結

令狐一衝

相關文章