Rust 拖慢開發(fā)速度,剛來實習(xí)生被折磨哭了
大家好,我叫漁夫。
Rust 如果你掌握了,開發(fā)速度也是驚人的,如還不夠熟悉基本概念、特性、標(biāo)準(zhǔn)庫等使用,那么寫 Rust 無疑就是和編輯器做斗爭的,前期非常痛苦,還好現(xiàn)在的 IDE 非常智能。
今天,我們來一起看這個非常實用的 Trait。
Drop
Drop 的作用就是釋放實現(xiàn)者的實例擁有的資源,意思是當(dāng)一個值的擁有者消失的時候,Rust 會丟棄這個值,通常用于資源清理。實際中,比如關(guān)閉文件、網(wǎng)絡(luò)連接或釋放內(nèi)存等等場景。
例子:
struct FileResource {}
impl Drop for FileResource {
fn drop(&mut self) {
println!("FileResource 被銷毀,資源被釋放。");
}
}
fn main() {
{
let resource = FileResource {};
}
println!("FileResource 已離開作用域。");
}
這個例子中,定義一個簡單的空結(jié)構(gòu)體 FileResource,如果這個結(jié)構(gòu),不再被使用時應(yīng)該執(zhí)行釋放掉的。
然后,去實現(xiàn) Drop 特質(zhì),這個方法將在結(jié)構(gòu)體的實例中,不再使用時自動被調(diào)用。在 drop 方法中,實際我們會編寫一些釋放資源的相關(guān)代碼。本實例,作為演示只打印了一條消息來表示 drop 方法被調(diào)用了。你也可以做類似如關(guān)閉文件、斷開網(wǎng)絡(luò)連接或釋放分配的內(nèi)存等相關(guān)邏輯。
main 函數(shù),在作用域中創(chuàng)建實例 resource ,當(dāng)這個作用域結(jié)束時,那么resource 會自動離開作用域,這時 Rust 自動調(diào)用,也可以理解為它的生命周期也就結(jié)束了,不可再被使用了。
離開作用域后,Rust 將負(fù)責(zé)調(diào)用 drop 方法來執(zhí)行清理工作。這也是 Rust 自動資源管理和“析構(gòu)”行為,目的應(yīng)該是防止資源泄漏及資源濫用情況。
最后打印結(jié)果:
FileResource 被銷毀,資源被釋放。
FileResource 已離開作用域。
Clone
Clone 的作用適用在,允許一個對象的實例被顯式地復(fù)制。當(dāng)你的類型實現(xiàn)了 Clone 特質(zhì),那么就可以使用其 clone 方法來創(chuàng)建該類型的一個新實例,這個新實例與原始實例一模一樣,但擁有不同的內(nèi)存地址。
使用場景也是非常廣泛的,如:
- 避免共享可變引用
- 保持原始數(shù)據(jù)不變
- 傳遞數(shù)據(jù)給函數(shù)
- 實現(xiàn)非原子或復(fù)雜類型的默認(rèn)行為
- 緩存或備份
使用 Clone 通常涉及深拷貝,對于大型或復(fù)雜的數(shù)據(jù)結(jié)構(gòu),性能內(nèi)存使用情況,也需要考慮。
例子:
#[derive(Clone)]
struct DemoStruct {
field: i32,
}
fn main() {
let original = DemoStruct { field: 23 };
let clone = original.clone(); // 相當(dāng)于創(chuàng)建一個副本
println!("原始對象的 field: {}", original.field);
println!("克隆對象的 field: {}", clone.field);
}
執(zhí)行結(jié)果:
原始對象的 field: 23
克隆對象的 field: 23
Copy
Copy 特質(zhì)也是一樣允許一個類型的值在賦值或作為函數(shù)參數(shù)傳遞時被隱式復(fù)制。這個通常適用于小型和簡單的值類型,如整數(shù)和浮點數(shù)等。
當(dāng)允許一個類型成為 Copy ,值得注意的是,如果如果復(fù)制開銷很大,也并適合進(jìn)行這種隱式復(fù)制的。所以,對大型或復(fù)雜的數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)會被完整復(fù)制,導(dǎo)致性能問題。
例子:
#[derive(Clone, Copy)]
struct DemoStruct {
field: i32,
}
fn main() {
let original = DemoStruct { field: 32 };
let copy = original;
println!("原始對象的 field: {}", original.field);
println!("復(fù)制對象的 field: {}", copy.field);
}
在 main 函數(shù)中,創(chuàng)建了 DemoStruct 的一個實例 original,然后通過簡單的賦值創(chuàng)建了一個名為 copy 的新實例。由于 DemoStruct 實現(xiàn)了 Copy 特質(zhì),original 會被自動復(fù)制給 copy,而不是移動(move)。
其他的:
- Sized
- Deref 與 DerekfMut
- Default
- AsRef和AsMut
- Borrow 和 BorrowMut
- From 和 Into
- TryFrom 和 TryInto
- ToOwned