27.泛型generics.rs
生活随笔
收集整理的這篇文章主要介紹了
27.泛型generics.rs
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*
fn max(array: &[i32]) -> i32 {let mut max_index = 0;let mut i = 1;while i < array.len() {if array[i] > array[max_index] {max_index = i;}i += 1;}array[max_index]
}//下來一段代碼并不是用來運行的,而是用來描述一下函數泛型的語法格式
//關鍵也編譯不過:binary operation `>` cannot be applied to type `T`(并不是所有的數據類型都可以比大小)
fn max<T>(array: &[T]) -> T {let mut max_index = 0;let mut i = 1;while i < array.len() {if array[i] > array[max_index] {max_index = i;}i += 1;}array[max_index]}
*///最簡單的使用
fn test_1() {struct Point<T> {x: T,y: T,}//使用時并沒有聲明類型,這里使用的是自動類型機制let p1 = Point { x: 1, y: 2 };let p2 = Point { x: 1.0, y: 2.0 };//但不允許出現類型不匹配的情況如下://let p3 = Point {x: 1, y: 2.0};//x 與 1 綁定時就已經將 T 設定為 i32,所以不允許再出現 f64 的類型。//如果我們想讓 x 與 y 用不同的數據類型表示,可以使用兩個泛型標識符struct Point2<T1, T2> {x: T1,y: T2,}
}fn test_2() {println!("-------------test_2------------");struct Point<T1, T2> {x: T1,y: T2,}//給泛型結構體定義泛型方法//注意,impl 關鍵字的后方必須有 <T>,因為它后面的 T 是以之為榜樣的impl<T1, T2> Point<T1, T2> {fn x(&self) -> &T1 {&self.x}fn y(&self) -> &T2 {&self.y}}//也可以為其中的一種泛型添加方法impl Point<f64, i32> {fn xx(&self) -> f64 {self.x}}let p = Point { x: 1, y: 2 };println!("p.x = {},p.y = {}", p.x(), p.y());let p2 = Point { x: 1.1, y: 2 };println!("p.xx = {}", p2.xx());//也可以隨意指定泛型代表的值,只不過由于沒有對應的泛型方法,所有無方法可用let p3 = Point { x: 1.1, y: "1111111111" };}fn test_3() {println!("-------------test_3------------");/*在使用泛型時,類型參數常常必須使用 trait 作為約束(bound)來明確規定 類型應實現哪些功能。例如下面的例子用到了 Display trait 來打印所以它用 Display 來約束 T,也就是說 T 必須實現 Display。*/use std::fmt::*;#[derive(Debug,Default)]struct StDebug{}//trait Debug{}// 泛型 `T` 必須實現 `Debug` 。只要滿足這點,無論什么類型// 都可以讓下面函數正常工作。fn print_debug<T: Debug>(t: &T) {println!("{:?}", t);}let tt:StDebug = Default::default();print_debug(&tt);}fn main() {test_1();test_2();test_3();
}
?
總結
以上是生活随笔為你收集整理的27.泛型generics.rs的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 26.PhantomData幽灵数据.r
- 下一篇: 28.特性trait.rs