1. 程式人生 > >rust學習筆記中級篇1–泛型(霜之小刀)

rust學習筆記中級篇1–泛型(霜之小刀)

rust學習筆記中級篇1–泛型(霜之小刀)

歡迎轉載和引用,若有問題請聯絡
若有疑問,請聯絡
Email : [email protected]
QQ:2279557541


結構體泛型

首先上程式碼,如何定義一個泛型的結構體

struct Point<T>{
    m_x:T,
    m_y:T
}
fn main() {
    let a = Point{m_x:10, m_y:20};
    let b = Point{m_x:1.0f32, m_y:2.0f32};
}

簡單的看,貌似和c++一樣的啊,只是在struct定義結構裡面加個,其中T泛指型別,也就是說結構體內容中,只要用到T的地方都是同一種輸入型別。
這樣我們定義let a = Point{m_x:10, m_y:20};

的時候,10和20都是i32型的,所以,編譯器就推倒我們此時的T代表的是i32,而定義let b = Point{m_x:1.0f32, m_y:2.0f32};的時候,編譯器可以推匯出這裡的T代表的是f32型別的。
就是這種能代表i32也能代表f32,同時還能代表任何型別(泛型別)的東東叫做模板。
另外要擴充套件下,結構體泛型並不是只能有一個泛型別,在尖括號中是可以定義多個的,比如

struct Example<T,N>{
    m_x:T,
    m_y:N
} 

列舉泛型

寫到這裡我突然發現,寫基本型別的時候貌似沒說列舉這個型別。。。
那就順帶著講一下,rust的列舉和c++等語言不一樣,c++的列舉其實就是個普通的int的感覺,但是rust得列舉是能有多種型別的。比如這樣寫就是對的

enum E{
    E0,
    E1(i32), 
    E2(i8,i8,i8)
}

其中E0更像C++中的意思,沒關聯資料型別,就僅僅是一個用於判斷是使用的東東。
而E1關聯了一個i32的型別,可以使用let x = E::E1(10)來使用。
E2同E1是一樣的,只是多了幾個成員而已。
而知道了前面的結構體泛型如何用,列舉就簡單了,直接上點程式碼搞定!

enum E<T,K>{
    E0,
    E1(T),
    E2(bool),
    E3(T,K,i8)
}

函式泛型

直接上程式碼,其中T就是指代泛型別的

fn func_add
<
T>(a:T, b:T)->T { return a+b; } fn main() { let b = func_add(10, 11); }
運行了麼?發現問題了麼????對 ,報錯了。。。
binary operation `+` cannot be applied to type `T`。

千萬別問我為什麼,我也不知道。。。只是感覺好像編譯器沒法再編譯的時候推到泛型T的+操作符。
不過在下一篇部落格trait:定義共享的行為裡面應該會講到!