Rust 學習之運算子過載

2022-03-15 03:49:37 字數 2600 閱讀 5724

關於運算子過載,在《rust 程式語言》中沒有找到相關章節,但在《rust 基礎》(英文名是 rustprimer)中找到了相關章節

運算子過載,就是對已有的運算子重新進行定義,賦予其另一種功能,以適應不同的資料型別。

通俗的講,就是自定義一些運算子的功能,使**看起來支援一些特殊資料型別的運算。

此外,《通過例子學 rust》的描述感覺更易懂:

在 rust 中,很多運算子可以通過 trait 來過載。也就是說,這些運算子可以根據它們的 輸入引數來完成不同的任務。這之所以可行,是因為運算子就是方法呼叫的語法糖。例 如,a + b 中的 + 運算子會呼叫 add 方法(也就是 a.add(b))。這個 add 方 法是 add trait 的一部分。因此,+ 運算子可以被任何 add trait 的實現者使用。

首先我們通過 rust 標準庫文件的例子入門:

use std::ops::;

#[derive(debug, partialeq)]

struct point

impl add for point

}}#[cfg(test)]

mod tests + point , point );

}}

上面的**中,宣告了乙個新的型別point,隨後,為這個型別實現了addtrait,這樣,在乙個表示式中,對 point 型別的資料進行了+運算時,就會呼叫 trait 中的add方法,實現 point 型別的資料的相加。

因為最熟悉的語言是 php,對 php 中陣列的+運算尤為深刻。所以打算對 rust 陣列也實現類似的功能。

php 中兩個陣列相加,有點類似於 merge,但跟 merge 又有所區別:如果第乙個陣列中的某個元素下標已存在,則會忽略第二個陣列中相同下標的元素;如果下標 a 在第 1 個陣列中不存在,則將第 2 個陣列中該下標對應的元素 merge 到新陣列中。比如:

$a1  = [1,2,3];

$a2 = [3,4,5,6,7];

var_dump($a1 + $a2);

$a1$a2相加後,最終的結果是:[1, 2, 3, 6, 7]。因為$a2345對應的下標是012,而這幾個下標在$a1中是已存在的。因此忽略。只將元素67merge 進新陣列。

我們再看下 rust 中陣列相加預設是什麼行為:

#[test]

fn test_vec_plus() -{}", a1, a3)

assert!(false);

}

執行測試用例cargo t -- notes::op_rhs::tests

error[e0369]: cannot add `std::vec::vec` to `std::vec::vec`

--> src/notes/op_rhs.rs:33:21

|33 | let a3 = a1 + a2;

| -- ^ -- std::vec::vec| |

| std::vec::vec|

= note: an implementation of `std::ops::add` might be missing for `std::vec::vec`

很遺憾,rust 預設對vec型別沒有實現+的運算子過載。那我們嘗試自己手動實現吧。

由於 rust 的 orphan 規則,我們不能對標準庫中的 vec 實現 add trait,因此,必須得用自己定義的型別包裝一下:

#[derive(debug, partialeq)]

struct myvec(vec);

針對myvec型別 add trait,即實現 add 方法:

fn add(self, other: myvec) -> myvec 

let mut v3: vec= vec::new();

self.0.iter().for_each(|x| v3.push(*x));

let len1 = self.0.len();

let len2 = other.0.len();

if len1 < len2

}myvec(v3)

}

最後,寫乙個測試用例:

#[test]

fn test_vec_plus()

完整源**參考這裡

運算子過載之過載型別運算子

普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...

過載之運算子過載

運算子過載,就是對已有的運算子重新進行定義,賦予其另一種功能,以適應不同的資料型別 運算子過載的宣告方式與方法的宣告方式相同,但operator關鍵字告訴編譯器,它實際上是乙個運算子過載,後面是相關運算子的符號,在本例中就是 返回型別是在使用這個運算子時獲得的型別。在本例中,把兩個向量加起來會得到另...

c 學習之運算子過載

今天這篇部落格 寫的是運算子的過載,這裡單純的寫了 號的運算子的過載,主要就是為了在以後需要的時候能夠找到對應的資料,還有就是通過作用域解析運算子來返回我們通過返回乙個物件 這裡有些運算子是不能載入的,有些運算子是只能通過成員函式來載入,以下截圖來自c primer plus 這段 寫的是乙個複數的...