頭條地址: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 協議》,轉載必須註明作者和本文連結