当前位置:网站首页>Cells in rust share variable pointers

Cells in rust share variable pointers

2022-04-23 18:03:00 Xu Yeping

Rust Medium Cell Shared variable pointer

1 First time to know Cell

Cell and Box It's almost functional , But it allows multiple variables to share content , It is also allowed to modify the content when multiple variables are shared . Let's take an example :

use std::cell::Cell;
fn main() {
    
    let x = Cell::new(123);
    println!("{:?}", x);
}
------------------------------------------------------
>cargo run
Cell {
     value: 123 }

2 Multiple references can be modified , Modify data in many ways

Be careful , Variable x Not added mut modification , The following code can also be modified . This explanation Cell The internal modification behavior of should adopt some kind of unsafe In the form of , Only from the surface form of the function call, we can't see the behavior of the variable to be modified . In this way, the check of the modification operation is transferred from the compile time to the run time of the , from Cell Your code determines whether there is a modification conflict .

use std::cell::Cell;
fn main() {
    
    let x = Cell::new(123);
    x.set(456);
    println!("{:?}", x);
}
------------------------------------------------------
>cargo run
Cell {
     value: 456 }

Because there is no right x use mut, Therefore, the compiler will think that it is aimed at x All operations are read-only , No errors will be reported during compilation for potential modification actions .

because rust Allow multiple read-only references , therefore ,Cell It's like secretly opening a back door , Allow multiple different references to modify the content of the same variable .

use std::cell::Cell;
fn main() {
    
    let x = Cell::new(123);
    let a = &x;
    let b = &x;
    a.set(456);
    b.set(789);
    println!("{:?}", x);
}
------------------------------------------------------
>cargo run
Cell {
     value: 789 }

in fact , a and b Is directed x Variable references to , But from the surface grammar , It doesn't need to mut keyword , Therefore, you can bypass the syntax check of the compiler .

3 Read the content

If the content book can Copy Of , It can also be used. get Method to copy the contents to other variables .

use std::cell::Cell;
fn main() {
    
    let x = Cell::new(123);
    x.set(456);
    let y = x.get();
    println!("{:?}, {:?}", x, y);
}
------------------------------------------------------
>cargo run
Cell {
     value: 456 }, 456

If the content is not implemented Copy characteristic , be get Method cannot be used .

use std::cell::Cell;
fn main() {
    
    let x = Cell::new("hello".to_string());
    x.set("nice".to_string());
    let y = x.get();
    println!("{:?}, {:?}", x, y);
}
------------------------------------------------------
>cargo run
--> src\main.rs:5:15
    |
5   |     let y = x.get();
    |               ^^^
    | 
   ::: C:\Users\xxxx\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\alloc\src\string.rs:292:1
    |
292 | pub struct String {
    
    | ----------------- doesn't satisfy `String: Copy`

版权声明
本文为[Xu Yeping]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/04/202204230544498565.html