Rust中泛型的學(xué)習(xí)筆記
概述
在Rust語言中,泛型是一種強(qiáng)大的工具,它允許我們編寫可復(fù)用且靈活的代碼。通過泛型,我們可以創(chuàng)建適用于多種類型的數(shù)據(jù)結(jié)構(gòu)和函數(shù),而無需為每種類型都重復(fù)編寫相同的邏輯。在Rust中,泛型通過指定類型參數(shù)來實(shí)現(xiàn),這些類型參數(shù)會(huì)在編譯時(shí)被具體類型所替換。
泛型函數(shù)
泛型函數(shù)允許我們定義可以在多種類型上操作的函數(shù),而無需為每種類型單獨(dú)編寫函數(shù)。在函數(shù)簽名中,我們可以使用類型參數(shù)來指定可以接受哪些類型。
use std::fmt::Display;
// 泛型函數(shù),T是類型參數(shù)
fn print_value<T: Display>(value: T) {
println!("value is: {}", value);
}
fn main() {
// 使用整數(shù)類型打印
print_value(666);
// 使用字符串類型打印
print_value("CSDN");
}在上面的示例代碼中,T是一個(gè)類型參數(shù),它實(shí)現(xiàn)了Display特征。當(dāng)調(diào)用print_value函數(shù)時(shí),編譯器會(huì)根據(jù)傳入的實(shí)際參數(shù)類型推斷出T的具體類型。
泛型結(jié)構(gòu)體
除了泛型函數(shù),Rust還允許我們定義泛型結(jié)構(gòu)體。在泛型結(jié)構(gòu)體中,我們可以使用類型參數(shù)來聲明字段。
struct Block<T> {
value: T
}
fn main() {
// 包含整數(shù)類型值的Block
let block1 = Block { value: 66 };
println!("{}", block1.value);
// 包含字符串類型值的Block
let block2 = Block { value: "CSDN".to_string() };
println!("{}", block2.value);
}在上面的示例代碼中,我們首先定義了一個(gè)名為Block的泛型結(jié)構(gòu)體,它有一個(gè)類型為T的字段value。然后,我們可以創(chuàng)建包含不同類型值的Block實(shí)例。最后,我們打印輸出了Block實(shí)例的value字段。
在Rust中,我們還可以定義具有多個(gè)類型參數(shù)的泛型函數(shù)或結(jié)構(gòu)體。
struct CustomPair<T, U> {
first: T,
second: U,
}
impl<T, U> CustomPair<T, U> {
fn new(first: T, second: U) -> Self {
CustomPair { first, second }
}
}
fn main() {
// 創(chuàng)建一個(gè)CustomPair,第一個(gè)是整數(shù)類型,第二個(gè)是字符串類型
let pair1 = CustomPair::new(66, "CSDN".to_string());
// 輸出:66 CSDN
println!("{} {}", pair1.first, pair1.second);
// 創(chuàng)建一個(gè)CustomPair,第一個(gè)是字符串類型,第二個(gè)是浮點(diǎn)數(shù)類型
let pair2: CustomPair<String, f64> = CustomPair::new("sin".to_string(), 3.14);
// 輸出:sin 3.14
println!("{} {}", pair2.first, pair2.second);
}在上面的示例代碼中,T和U是獨(dú)立的類型參數(shù)。當(dāng)實(shí)例化這樣的泛型時(shí),編譯器會(huì)根據(jù)實(shí)際傳入的類型推斷出這些類型參數(shù)的具體類型。創(chuàng)建CustomPair類型的實(shí)例pair1時(shí),第一個(gè)是整數(shù)類型,第二個(gè)是字符串類型。創(chuàng)建CustomPair類型的實(shí)例pair2時(shí),第一個(gè)是字符串類型,第二個(gè)是浮點(diǎn)數(shù)類型。
泛型方法
泛型方法是指在泛型結(jié)構(gòu)體或泛型枚舉上定義的方法,它可以使用結(jié)構(gòu)體或枚舉中的類型參數(shù)。
struct Container<T> {
value: T,
}
impl<T> Container<T> {
// 接受任何類型T作為輸入,返回該類型的引用
fn get_value(&self) -> &T {
&self.value
}
// 接受另一個(gè)Container作為輸入
fn replace_with<U>(&mut self, other: Container<U>)
where
T: Copy,
U: Into<T>,
{
let new_value = other.value.into();
self.value = new_value;
}
}
fn main() {
let mut container1 = Container { value: 66 };
// 輸出:66
println!("{}", container1.get_value());
let container2 = Container { value: "CSDN".to_string() };
container1.replace_with(Container { value: 100 });
// 輸出:100
println!("{}", container1.get_value());
}在上面的示例代碼中,Container結(jié)構(gòu)體有一個(gè)類型參數(shù)T。get_value方法是一個(gè)泛型方法,因此適用于所有類型的Container實(shí)例。replace_with方法也是一個(gè)泛型方法,但它通過where子句引入了更多的類型約束。
1、T: Copy約束表明方法操作的類型T必須實(shí)現(xiàn)Copy特征。
2、U: Into<T>約束意味著第二個(gè)Container的類型參數(shù)U可以轉(zhuǎn)換為T。
通過這樣的泛型方法,我們可以編寫更加通用、可復(fù)用的代碼,在不同的數(shù)據(jù)類型上都表現(xiàn)出一致的行為。
在本篇的內(nèi)容中,我們實(shí)際上已經(jīng)接觸到了不少特征的概念,比如:Display特征、Copy特征等。在下一篇文章中,我們將詳細(xì)介紹Rust的特征,也就是Trait。
到此這篇關(guān)于Rust中泛型的學(xué)習(xí)筆記的文章就介紹到這了,更多相關(guān)Rust 泛型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Rust?use關(guān)鍵字妙用及模塊內(nèi)容拆分方法
這篇文章主要介紹了Rust?use關(guān)鍵字妙用|模塊內(nèi)容拆分,文中還給大家介紹use關(guān)鍵字的習(xí)慣用法,快速引用自定義模塊內(nèi)容或標(biāo)準(zhǔn)庫(kù),以此優(yōu)化代碼書寫,需要的朋友可以參考下2022-09-09
Rust生命周期之驗(yàn)證引用有效性與防止懸垂引用方式
本文介紹了Rust中生命周期注解的應(yīng)用,包括防止懸垂引用、在函數(shù)中使用泛型生命周期、生命周期省略規(guī)則、在結(jié)構(gòu)體中使用生命周期、靜態(tài)生命周期以及如何將生命周期與泛型和特質(zhì)約束結(jié)合,通過這些機(jī)制,Rust在編譯時(shí)就能捕獲內(nèi)存安全問題2025-02-02
Rust語言之結(jié)構(gòu)體和枚舉的用途與高級(jí)功能詳解
Rust 是一門注重安全性和性能的現(xiàn)代編程語言,其中結(jié)構(gòu)體和枚舉是其強(qiáng)大的數(shù)據(jù)類型之一,了解結(jié)構(gòu)體和枚舉的概念及其高級(jí)功能,將使你能夠更加靈活和高效地處理數(shù)據(jù),本文將深入探討 Rust 中的結(jié)構(gòu)體和枚舉,并介紹它們的用途和高級(jí)功能2023-10-10

