Rust中的RefCell和內部可變性

2021-10-02 01:12:46 字數 1758 閱讀 7506

refcell

rust在編譯階段會進行嚴格的借用規則檢查,規則如下:

即在編譯階段,當有乙個不可變值時,不能可變的借用它。如下**所示:

fn main()
會產生編譯錯誤:

error[e0596]: cannot borrow immutable local variable `x` as mutable

--> src/main.rs:32:18

|31 | let x = 5;

| - consider changing this to `mut x`

32 | let y = &mut x;

| ^ cannot borrow mutably

但是在實際的程式設計場景中可能會需要在有不可變引用時改變資料的情況,這時可以考慮rust中的內部可變性。其借用規則檢查由編譯期推遲到執行期。對應的,在編譯期借用規則檢查不通過,則會產生編譯錯誤;而執行期借用規則檢查不通過,則會panic,且有執行期的代價。

所以實際**中使用refcell的情況是當你確定你的**遵循借用規則,而編譯器不能理解和確定的時候。**仍然要符合借用規則,只不過規則檢查放到了執行期。

refcell**例項1:

use std::cell::refcell;

fn main()

}

執行結果:

thread 'main' panicked at 'already mutably borrowed: borrowerror', libcore/result.rs:983

:5note: run with `rust_backtrace=1` for a backtrace.

可以看到在執行時進行了借用檢查,並且panic!

refcell**例項2:

#[derive(debug, default)]

struct data

impl data

*cache = 100;

*cache

}//編譯錯誤:cannot mutably borrow field of immutable binding

pub fn value_a(&self) -> u8

self.a = 100;

self.a

}}fn main() ", value);

value.value_b();

println!("", value);

}

value_a注釋掉執行結果如下:

data  }

data }

很多時候我們只能獲取乙個不可變引用,然而又需要改變所引用資料,這時用refcell是解決辦法之一。

內部可變性

內部可變性(interior mutability)是rust中的乙個設計模式,它允許你即使在有不可變引用時改變資料,這通常是借用規則所不允許的。為此,該模式在資料結構中使用unsafe**來模糊rust通常的可變性和借用規則。當可以確保**在執行時會遵守借用規則,即使編譯器不能保證的情況,可以選擇使用那些運用內部可變性模式的型別。所涉及的 unsafe **將被封裝進安全的 api 中,而外部型別仍然是不可變的。

rust的綠卡 rust中的Pin詳解

rust中的pin詳解 相關概念 pin這是乙個struct,作用就是將p所指向的t在記憶體中固定住,不能移動。說白一些,就是不能通過safe 拿到 mut t。pin定義如下 pub struct pin pointer p,unpin 這是乙個trait,定義在std marker中,如果乙個t...

rust中的型別

rust提供了幾種機制來實現基本型別和使用者自定義型別的轉換和定義。rust中沒有提供基本型別之間隱式地型別的轉換。但是,我們可以通過as關鍵字來進行顯示型別的轉換。在rust中,數字型別的轉換和c語言中的轉換一樣,除了c語言中的未定義的行為。整數型別之間的所有轉換情況都已經在rust中定義好了。禁...

Rust中的常量

示例程式 fn main max points 上述程式定義了乙個常量 max points 並賦值為 100000。rust 中使用 const 關鍵字來宣告常量 constant 必須顯式地標註常量值得型別。常量和變數的區別 常量可以被宣告在任何作用域中,甚至包括全域性作用域。這在乙個值需要被不...