W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
有時(shí)候,寫(xiě)一個(gè)函數(shù)或數(shù)據(jù)類型時(shí),我們可能希望它可以作為多種類型的工作參數(shù)。幸運(yùn)的是,Rust 給我們提供了一種更好地解決辦法:泛型。在類型理論中,泛型類型被稱為“參數(shù)多態(tài)性”,這意味著在給定參數(shù)(變量)的情況下,他們是具有多種形式的類型或函數(shù) (“聚”是多個(gè)“變形”形式)。
不管怎樣,類型理論已經(jīng)足夠充分,讓我們看看一些通用的代碼。Rust 的標(biāo)準(zhǔn)庫(kù)提供了一個(gè)類型, Option<T>
,這是通用的:
enum Option<T> {
Some(T),
None,
}
< T >
部分。正如你之前已經(jīng)見(jiàn)到過(guò)的,表明這是一個(gè)通用的數(shù)據(jù)類型。在我們枚舉的聲明里面,無(wú)論我們?cè)谀睦锟吹?T,我們用泛型中相同的數(shù)據(jù)類型來(lái)作為那個(gè)數(shù)據(jù)類型的替代品。這里有一個(gè)使用 Option<T>
的例子,與一些額外的類型注解:
let x: Option<i32> = Some(5);
在類型聲明里面,我們用 Option<i32>
。請(qǐng)注意它與 Option<T>
看起來(lái)非常類似。所以,在這個(gè)特殊的選項(xiàng) T 中,T 的值為 i32。在等號(hào)的右邊,有一個(gè) some(T),T 的值是 5。因?yàn)檫@是一個(gè) i32,所以雙方能夠匹配。此時(shí) Rust 運(yùn)行沒(méi)有錯(cuò)誤。如果他們不匹配,我們會(huì)得到一個(gè)錯(cuò)誤:
let x: Option<f64> = Some(5);
// error: mismatched types: expected `core::option::Option<f64>`,
// found `core::option::Option<_>` (expected f64 but found integral variable)
這并不意味著我們不能讓 Option<T>s
的值為 f64 !他們必須匹配才可以:
let x: Option<i32> = Some(5);
let y: Option<f64> = Some(5.0f64);
這樣很好。因?yàn)橐粋€(gè)定義,可以用于多個(gè)用途。
泛型不必只是通用的一種類型??紤] Rust 的標(biāo)準(zhǔn)庫(kù)里面的另一種相似的類型,Result<T, E>
enum Result<A, Z> {
Ok(A),
Err(Z),
}
這個(gè)類型對(duì)這兩種類型都是通用的:T 和 E,順便說(shuō)一下,大寫(xiě)字母可以是任何你喜歡的字母。我們可以定義 Result<T, E >
如下:
enum Result<A, Z> {
Ok(A),
Err(Z),
}
如果我們想要這樣。公約說(shuō),第一個(gè)通用的參數(shù)應(yīng)該是 T,它對(duì)應(yīng)于“類型”,我們使用 E 對(duì)應(yīng)于 error。然而,Rust 并不關(guān)心這些。
Result<T, E>
類型的作用是用于返回計(jì)算的結(jié)果,并能夠在發(fā)生差錯(cuò)的時(shí)候返回一個(gè)錯(cuò)誤。
我們可以用相似的語(yǔ)法編寫(xiě)帶有泛型的函數(shù):
fn takes_anything<T>(x: T) {
// do something with x
}
語(yǔ)法分為兩個(gè)部分:< T >
表示“這個(gè)函數(shù)對(duì)類型 T” 是通用,和 x:T 表示“x 的類型為 T .”
多個(gè)參數(shù)可以有相同的泛型類型:
fn takes_two_of_the_same_things<T>(x: T, y: T) {
// ...
}
我們可以寫(xiě)一個(gè)擁有多種類型的版本:
fn takes_two_things<T, U>(x: T, y: U) {
// ...
}
對(duì)于特征邊界來(lái)說(shuō)通用函數(shù)是最有用的,我們將在特征部分討論它。
你可以存儲(chǔ)一個(gè)泛型類型的結(jié)構(gòu):
struct Point<T> {
x: T,
y: T,
}
let int_origin = Point { x: 0, y: 0 };
let float_originstruct Point<T> {
x: T,
y: T,
}
let int_origin = Point { x: 0, y: 0 };
let float_origin = Point { x: 0.0, y: 0.0 };
類似于函數(shù),< T >
是我們聲明泛型參數(shù)的地方,然后,我們?cè)陬愋吐暶骼锸褂?x:T。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: