關於運算子過載,在《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
,隨後,為這個型別實現了add
trait,這樣,在乙個表示式中,對 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]
。因為$a2
中3
,4
,5
對應的下標是0
,1
,2
,而這幾個下標在$a1
中是已存在的。因此忽略。只將元素6
,7
merge 進新陣列。
我們再看下 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 這段 寫的是乙個複數的...