`

rust cell

    博客分类:
  • rust
 
阅读更多
fn test_cell(){
    use std::cell::Cell;
    struct Foo{
        x:  u32,
        y:  Cell<u32>
    }
    let foo = Foo {x:1,y:Cell::new(3)};
    assert_eq!(1,foo.x);
    println!("y:{:?}",foo.y.get());
    foo.y.set(6);
    println!("y:{:?}",foo.y.get());
}

y:3
y:6


RefCell<T>提供了borrow/borrow_mut方法,对应Cell<T>的get/set方法.
RefCell<T>虽然没有分配空间,但它是有运行时开销的,因为它自己维护着一个运行时借用检查器,如果在运行时出现违反借用规则的情况,比如持有多个可变借用,则会引发线程panic
fn test_refCell(){
    use std::cell::RefCell;
    let x = RefCell::new(vec![1,2,3,4]);
    println!("{:?}",x.borrow());
    x.borrow_mut().push(6);
    println!("{:?}",x.borrow());
}

[1, 2, 3, 4]
[1, 2, 3, 4, 6]
分享到:
评论

相关推荐

    cell-gc:Rust中的一个很小的GC,带有安全的API

    细胞 一个用于Rust的简单垃圾收集器。 目的是帮助您在Rust中快速构建VM。 因此,此GC专为: 安全不依赖于linters或编译器插件与高性能实现相一致的API(尽管现在cell-gc并不Swift) 乐趣注意事项cell-gc用于VM。 ...

    Once_cell:Rust库,用于单个分配单元和无宏的惰性静态

    《深入理解Rust库Once_cell:单个分配单元与惰性静态》 在Rust编程语言中,Once_cell是一个非常有用的库,它提供了一种在程序执行过程中仅初始化一次的机制,即所谓的“单个分配单元”(single allocation unit)。...

    Rust container cheat sheet.pdf

    - Cell&lt;T&gt;:提供内部可变性的类型,允许修改其包含的值,而不改变其引用。 - RefCell&lt;T&gt;:提供运行时检查的内部可变性类型。 此外,文档中提到的Rust的一些特殊功能,如: - &Trait、Box&lt;Trait&gt;:用于在不拥有数据...

    Dancing Links 精确覆盖算法的Rust实现_rust_代码_下载

    在Rust中,可以定义一个枚举类型(enum)来表示单元格的状态,例如`Cell { left: Cell, right: Cell, up: Cell, down: Cell, value: usize }`,其中`value`存储列的标识。同时,还需要一个全局的根节点,用于连接...

    深入浅出Rust - 范长春1

    内部可变性通过Cell、RefCell和UnsafeCell提供了在不变性约束下的安全改变。泄漏、Panic和Unsafe关键字则是讨论内存管理的其他重要方面。 高级抽象部分涵盖了泛型、闭包、动态分派和静态分派、容器和迭代器、生成器...

    leetcoderust-rust-interview-qs:练习用Rust解决的面试问题

    2. 树结构:二叉树、红黑树等,Rust中的`std::rc::Rc`和`std::cell::RefCell`可以实现共享指针,用于构建树形结构。 3. 动态规划:递推公式、记忆化搜索等方法在解决面试题中常被采用,如Fibonacci数列、最长公共子...

    程序设计训练之 Rust 编程语言 第八讲:高级特性与编程语言综述

    - 典型的例子包括`Vec`、`Cell/RefCell`、`Box`、`Rc/Arc`、`Send/Sync`、`HashMap`等。 **如何保证`unsafe`代码的正确性**: - 在开发标准库时,开发人员会极其谨慎地使用`unsafe`。 - 目前,虽然标准库的安全性...

    Rust 智能指针基础用法总结

    本资源总结了Rust中的常见智能指针用法,和示例代码。 例如Box,Raw Pointer裸指针 Rc计数指针 Cell与RefCell内部可变性 Weak指针 Arc原子计数指针 和Mutex锁 的用法和示例

    深入Rust的智能指针:内存安全的得力助手

    use std::cell::RefCell; let a = RefCell::new(5); // 创建一个新的RefCell智能指针 let b = a.borrow(); // 借用RefCell中的值 println!("b = {}", b); ``` ##### 2.5 `Mutex&lt;T&gt;`:互斥锁智能指针 `Mutex&lt;T&gt;`...

    railway:Rust内置的基于ECS的消息服务

    - `std::cell`和`std::rc`模块可以用来管理组件数据的共享和修改,确保线程安全。 - 利用`async/await`和tokio库可以实现异步消息处理,提高系统的响应速度。 在"railway-master"这个文件夹中,可能包含以下内容: ...

    rust-debruijn:Rust中的De Bruijn图

    锈渣De Bruijn图构建和路径压缩库。...以实现内存高效计数和DeBruijn图压缩可配置为绞合和非绞合输入序列广泛的单元测试套件在生产中用于10x Genomics的Supernova,Lang Ranger,Cell Ranger和Cell Ranger VDJ管道。

    multilist:Rust 的安全、侵入式双向链表

    multilist是一个 Rust 数据结构,表示一组侵入式双向链表,按数字索引。 多表拥有的对象可以属于任意数量的组成链表。 每个对象只使用一个分配,而不管它在多少个列表中。 当第一次添加一个对象时(例如通过push_...

    atomic_refcell:用于Rust的线程安全RefCell

    在Rust编程语言中,`std::cell::RefCell`是一个强大的工具,它允许我们创建内部可变性(Interior Mutability)的结构。然而,`RefCell`本身并不支持线程安全,这意味着在多线程环境中直接使用可能会导致数据竞争和...

    rust-alloc-no-stdlib:通用分配器的接口,因此no_std rust库可以在有或没有stdlib链接的情况下分配内存

    通过使用calloc预先分配最大数据限制并使用seccomp禁止将来的系统调用,该库还应该可以将需要动态分配的rust应用程序完全监禁。 用法 共有3种分配内存的方式,每种方式各有利弊 在堆栈上 根本不需要stdlib,这是...

    reindeer-maze-rust:这是一个迷宫,里面有名义上的驯鹿

    Rust中的枚举(enum)类型可能用于定义迷宫的元素,例如`Cell`,它可以是`Wall`、`Path`或`Goal`。同时,利用Rust的结构体(struct)来封装迷宫的坐标和状态信息。Rust的引用和所有权机制确保了在处理大型迷宫数据时...

    RustPrimer 中文版1

    `Mutex`和`RwLock`用于实现线程同步,`Cell`和`RefCell`则提供在不可变上下文中修改值的能力。 ### 智能指针 Rust的智能指针如`Box`、`Rc`和`Arc`提供了对内存管理的高级控制。它们能够实现垃圾回收的功能,同时...

    spectral_rs:基于Rust的伪谱PIC方法

    在现代科学计算领域,粒子-in-cell(PIC)方法是一种广泛应用于等离子体物理、电磁波与粒子相互作用等领域的数值模拟技术。它通过将等离子体中的宏观物理现象转化为大量微观粒子的运动来模拟。而"spectral_rs"是一个...

    redis-cell:Redis模块,可通过单个命令在Redis中提供速率限制

    表明,redis-cell的运行速度非常快,运行时间是基本Redis SET两倍(从Redis客户端看到,每个命令的运行时间大约为0.1毫秒)。安装。 如果有兴趣拥有当前不支持的体系结构或操作系统的二进制文件,请打开一个问题。 ...

    rustprimer-v1.13-大家新年快乐.pdf

    Cell, RefCell 类型系统中的几个常见 Trait Into/From 及其在 String 和 &str; 互转上的应用 AsRef, AsMut Borrow, BorrowMut, ToOwned Deref 与 Deref coercions Cow 及其在 String 和 &str; 上的应用 Send 和 Sync...

    gcmodule:受CPython gcmodule启发的Rust垃圾收集

    gcmodule 垃圾回收受...use std :: cell :: RefCell;type List = Cc&lt;RefCell&gt;&gt;&gt;&gt;;let a: List = Default :: default ();let b: List = Default :: default ();a. borrow_mut (). push ( Box :: new (b. clone ()));b

Global site tag (gtag.js) - Google Analytics