Rust借用機制的理解分析

2021-10-25 02:32:54 字數 862 閱讀 8819

rust初學者大多會遇到這樣的問題:

這一類借用規則的問題,實際上都可以通過另一種思路來很好地解答,當然這也是很多大佬一定程度上認可的理解方式:

rust中的借用,分為不可變借用

共享借用,和可變借用

獨佔借用

無論在教程中,還是語法中,我們都用可變性來區分二種借用,最開始,最直觀的理解:

但是我們可以試著換乙個方向去思考,用獨占性去區分兩種借用,很多問題便可以輕易理解:

這樣的思考方式從「可變性==>獨占性」換成了「獨占性==>可變性」,首先就直觀地解釋了「同一資源不可同時被可變借用和不可變借用」的問題,因為「獨佔借用」從字面上就不可能跟其他任何形式的借用共存。

再說到rc/arc。rc是通過引用計數來提供安全的共享訪問的只能指標,在c++中本就叫做"shared_ptr",從邏輯上就是提供共享訪問的工具,不應被任何一方獨佔,因此也理應只提供共享借用。而arc就是執行緒安全版的rc。

無論是std::cell系列還是mutex/rwlock,它們的目的都一致:為共享資源提供安全的可變訪問。由於既需要共享,也需要可變,因此無法用「獨佔=可變,共享=不可變」的型別模型去編譯期檢查訪問的安全性,只能在執行時通過實際的行為去動態檢查,保證「同一時間,乙個資源只可以被一方可變訪問,或被多方不可變訪問」的原則。只是它們的行為略有不同:

不難看出,很多情況下,arc的組合實際上跟rc的邏輯是一致的:在需要共享的可變資源時,先用rc/arc控制資源的生命週期,再用refcell/rwlock來控制資源的訪問安全,區別在於是否為跨執行緒訪問提供支援。

綜上所述,以個人經驗來講,在習慣上以獨佔借用/共享借用的視角來分析,而不是可變借用/不可變借用,更有助於理解借用規則的實質,希望以此可以給初接觸rust的同行一些啟發。

Rust模組的理解

特別注意,callerin這個mod必須在caller.rs中以pub mod callerin 形式宣告,否則外部看不到 最終模組路徑為 lip3 caller callerin call package name exp version 0.1.0 authors yujinliang 2857...

Rust中巨集的理解

巨集相比函式是相對難以理解的,更加難以掌握,編寫理解以及除錯都很有困難。但它的存在肯定是有它比較獨特的地方的。相比函式,巨集是用來生成 的,在呼叫巨集的地方,編譯器會先將巨集進行展開,生成 然後再編譯展開後的 在rust中,函式是不接受任意多個引數的,巨集可以辦到。巨集定義格式macro rules...

如何理解 rust 中的 Sync Send?

sync和send是 rust 安全併發中兩個至關重要的marker,但絕大多數的文件或書籍每當談到它們就只是直接丟擲它們的語義 導火索 rwlock 我之所以決定徹底搞清楚這兩個東西是因為我使用標準庫中的rwlock遇到了一些問題,檢視原始碼之後發現這兩行 先不管send stable featu...