Rust RefCell和內部可變性

2021-08-09 10:07:48 字數 1875 閱讀 4058

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 中,而外部型別仍然是不可變的。

內部類和匿名內部類

內部類 取個類名inner 有三種 成員內部類 相當於類中的成員 1.可以訪問外部類的成員變數.2.類中的成員函式訪問內部類 建立內部類的物件進行訪問.如 inner in new inner 3.外部其他類 不是內部類的直接外部類 訪問內部類的成員建立物件.格式 外部類名 內部類名 變數名 new...

內部類和匿名內部類

把類定義在其他類的內部,這個類就被稱為內部類。舉例 在類 a 中定義了乙個類 b,類 b 就是內部類。內部類的訪問特點 內部類可以直接訪問外部類的成員,包括私有。外部類要訪問內部類的成員,必須建立物件。按照內部類在類中定義的位置不同,可以分為如下兩種格式 成員位置 成員內部類 一般內部類就是不讓外界...

內部類和匿名內部類

內部類訪問特點 1,內部類可以直接訪問外部類中的成員。2,外部類要訪問內部類,必須建立內部類的物件 用於類的設計 分析事物時,發現該事物描述中還有事物,而且這個事物還在訪問被描述事物的內容,這時就是還有的事物定義成內部類來描述。class outer static void function 如果內...