首页 > 其他分享 >Rc与RefCell

Rc与RefCell

时间:2023-03-14 17:56:35浏览次数:37  
标签:mut messages let Rc RefCell sent

src/main.rs

#[derive(Debug)]
enum List {
    Cons(Rc<RefCell<i32>>, Rc<List>),
    Nil,
}

use crate::List::{Cons, Nil};
use std::borrow::BorrowMut;
use std::cell::RefCell;
use std::rc::Rc;
use std::str::FromStr;
/* 
fn main() {
    // varlu是 Rc引用 指向 RefCell的地址; RefCell指向一个堆上的5
    let value = Rc::new(RefCell::new(5));
    // a 是一个Rc引用, 它指向一个Cons地址; Cons由一个指向value的Rc引用,和一个预留字段(下一个节点位置)组成;
    let a = Rc::new(Cons(Rc::clone(&value), Rc::new(Nil)));
    // b、c 是一个Cons, 它由一个Rc-RefCell和一个预留字段组成
    let b = Cons(Rc::new(RefCell::new(3)), Rc::clone(&a));
    let c = Cons(Rc::new(RefCell::new(4)), Rc::clone(&a));

    let mut b1 = *value.borrow_mut() ;// 返回RefMut;
    let mut b2 = *value.borrow_mut() ;// 返回RefMut;

    println!("a after = {:?}", a);
    println!("b after = {:?}", b);
    println!("c after = {:?}", c);
}
*/
struct MyObj {
    //1. 
    //sent_messages:Vec<String>,
    //2. 
    //sent_messages: RefCell<i32>,
    //3. 
    sent_messages: Rc<RefCell<Vec<String>>>,
    //4. 
    //sent_messages: Rc<RefCell<i32>>,
}
impl MyObj {
    fn new() -> MyObj {
        MyObj {
            //1. 
            // sent_messages:vec![],
            //2. 
            // sent_messages: RefCell::new(5),
            //3. 
            sent_messages: Rc::new(RefCell::new(vec![])),
            //4.
            //sent_messages: Rc::new(RefCell::new(5)),
        }
    }
}
fn main(){
    let myObj = MyObj::new();
    // 1. 不能编译, 违反多引用规则,提示对象未实现copy
    // let mut d1 = myObj.sent_messages;
    // let mut d2 = myObj.sent_messages;

    // 2. 不能编译, 使用RefMut存储同样不能违反多引用规则。
    // let mut d1 = myObj.sent_messages.borrow_mut();
    // let mut d2 = myObj.sent_messages.borrow_mut();

    // 错误的结论
    // 3. 可以编译, 使用Rc包装RefMut, borrow过程相当于解引用Rc,获得不可变引用,BorrowMut相当于解引用RefCell,获得可变引用
    // ------------------------------------------------------|--Rc--|----RefCell----|
    //let d1=myObj.sent_messages.borrow();
    //let mut md1 =  myObj.sent_messages.borrow().borrow_mut();
    //let mut md2 =  myObj.sent_messages.borrow().borrow_mut();
    
    //4. 能编译, 不能(*rc1).borrow_mut() 两次, 编译不通过, 提示借用多次
    let rc1 = Rc::clone(&myObj.sent_messages);
    let mut mt1 = (*rc1).borrow_mut();
    mt1.push(String::from("message"));
    // ** 小结 **
    // Rc允许多个Rc指向同一个对象, 但是不允许移动和改变对象的值(值类型除外)
    // RefCell允许在不可变引用上修改对象内部的值,但是不能移动所有权,以借用的方式修改(返回RefMut,然后调用对象的方法,在改进之前直接调用对象方法会报错)。
}

标签:mut,messages,let,Rc,RefCell,sent
From: https://www.cnblogs.com/heath/p/17215708.html

相关文章

  • 远程代码执行漏洞RCE
    远程代码执行漏洞RCE1、RCERemoteCodeExecute远程代码执行RemoteCommandExecute远程命令执行2、危害窃取服务器的敏感数据、文件对电脑的文件加密,实施勒索......
  • java审计-RCE/SSRF
    java开发语言中可以执行命令的函数有Runtime.getRuntime.exec和ProcessBuilder.start java1.5之前用Runtime.getRuntime.exec1.5后用ProcessBuilder类构造进程  ......
  • OSCAR Open Source Industry Conference
    2022.9.16国家会议中心为了推动我国开源生态安全合规、可持续发展,中国信通院自2015年筹备国内首个开源联盟,提出“可信开源”理念,通过产业研究、标准评估、企业/项目级开......
  • dirsearch web网站目录扫描工具详解
    文章目录​​1dirsearch介绍​​​​2安装​​​​3实战演练​​​​3.1仅指定网址-u​​​​3.2指定网站语言-e​​​​3.3指定字典-w​​​​3.4递归目录-r​......
  • ElasticSearch 实现分词全文检索 - Scroll 深分页
    目录ElasticSearch实现分词全文检索-概述ElasticSearch实现分词全文检索-ES、Kibana、IK安装ElasticSearch实现分词全文检索-Restful基本操作ElasticSearch......
  • sql中varchar和nvarchar的区别,汉字前面加N
    参考:https://www.cnblogs.com/net5x/articles/9592295.htmlhttps://blog.csdn.net/qq_42692386/article/details/108148694     ......
  • ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp
    目录ElasticSearch实现分词全文检索-概述ElasticSearch实现分词全文检索-ES、Kibana、IK安装ElasticSearch实现分词全文检索-Restful基本操作ElasticSearch......
  • codeforce 2000+练习
    ThreeSequences2200https://www.luogu.com.cn/problem/CF1406D题解:贪心地想,令x为答案,则x应该为b的末项和c的首项,而每一步a(i)->a(i+1)若上升则b上升,若下降则c下降。故......
  • 记一次Elasticsearch GeoIpDownloader的启动异常排查过程
    公众号:MCNU云原生,文章首发地,欢迎微信搜索关注,更多干货,第一时间掌握!最近碰到了ElasticsearchGeoIpDownloader相关的一个异常,花费了不少精力排查,故此记录一下,希望碰到同样问......
  • Educational Codeforces Round 105 (Rated for Div
    EducationalCodeforcesRound105(RatedforDiv.2)ABCString给定一个字符串只有A、B和C构成。要求替换A、B、C为')'和'(',并且相同字母替换的是一样的,使得字符串变......