rust学习(简单链表)

编写一个简单链表,主要遇到的问题就是next指针(按照C的写法)的数据如何定义。按照网上的建议,一般定义如下:

struct Node {pub value:u32,pub next:Option<Rc<RefCell<Node>>>, //1
}

1.用Option主要是用None/Some来区分next节点是否有数据。RC是用来做智能支持来计数,防止被move后变量无法使用。RefCell是为了让RC的数据可写。

使用这个数据结构,基本上写代码没什么问题。目前我就遇到一个比较神奇的问题:使用borrow_mut之后,无法找到成员变量..

但是实际上上面类似的代码却能找到对应的成员变量。仔细对比了2个borrow_mut函数,你会发现,我去,完全是2个接口~

出现问题的时候的borrow_mut接口:

正常情况下:

一个是BorrowMut,一个是RefCell的。具体什么原因导致出现这样的问题?不知道,哈哈,我们先看一下怎么去解决这个问题。

我们发现,try_borrow_mut貌似只有refcell实现了,所以这个接口返回的是我们需要的值RefMut<>,但是注意一下,由于try_borrow_mut返回的是result,所以我们还需要unwrap一下。

这样就能愉快的使用了。附上简单的链表代码

use std::borrow::BorrowMut;
use std::rc::Rc;
use std::cell::RefCell;struct Node {pub value:u32,pub next:Option<Rc<RefCell<Node>>>,
}impl Node {pub fn new(v:u32)->Self {Node {value:v,next:None,}}
}pub struct LinkedList {head:Option<Rc<RefCell<Node>>>
}impl LinkedList {pub fn new()->Self {LinkedList{head:None,}}pub fn push(&mut self,value:u32) {if let Some(ref mut head) = self.head.clone() {let mut prev: Rc<RefCell<Node>> = head.clone();let mut current = head.clone();let mut pos :u32 = 0;loop {if current.borrow().value < value {if pos == 0 {let mut newhead = Node::new(value);newhead.next = Some(current.clone());self.head = Some(Rc::new(RefCell::new(newhead)));break;} else {let mut newhead = Node::new(value);newhead.next = Some(current.clone());prev.try_borrow_mut().unwrap().next = Some(Rc::new(RefCell::new(newhead)));break;}} else {prev = current.clone();let tmp = current.try_borrow_mut().unwrap().next.take().unwrap();current = tmp;pos = pos + 1;}}} else {self.head = Some(Rc::new(RefCell::new(Node::new(value))));}}pub fn dump(&self) {let mut p: Option<Rc<RefCell<Node>>> = self.head.clone();loop {match p {None=> {println!("end");return;},Some(v) => {let v1 = v.clone().try_borrow_mut().unwrap().value;println!("value is {}",v1);p = v.clone().try_borrow_mut().unwrap().next.clone();}}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/539300.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink通讯模型—Akka与Actor模型

Carl Hewitt 在1973年对Actor模型进行了如下定义&#xff1a;"Actor模型是一个把Actor作为并发计算的通用原语". Actor是异步驱动&#xff0c;可以并行和分布式部署及运行的最小颗粒。也就是说&#xff0c;它可以被分配&#xff0c;分布&#xff0c;调度到不同的CPU&…

.Net使用ElasticSearch

文章目录 前言主体内容一.Kibana中ElasticSearch的基础操作1.GET&#xff08;查询&#xff09;1.POST&#xff08;新增&#xff09;1.PUT&#xff08;修改&#xff09;1.DELET&#xff08;删除&#xff09; 二.在.Net中&#xff0c;对ElasticSearch进行基础操作1.DotNet连接Ela…

大模型笔记:吴恩达 ChatGPT Prompt Engineering for Developers(1) prompt的基本原则和策略

1 intro 基础大模型 VS 用指令tune 过的大模型 基础大模型 只会对prompt的文本进行续写 所以当你向模型发问的时候&#xff0c;它往往会像复读机一样续写几个问题这是因为在它见过的语料库文本&#xff08;通常大多来自互联网&#xff09;中&#xff0c;通常会连续列举出N个问…

react/vue项目刷新页面404的原因以及解决办法

项目 公司官网 背景 1、问题描述&#xff1a;react/vue项目&#xff0c;正常的页面操作跳转&#xff0c;不会出现404的问题&#xff0c;但是一旦刷新&#xff0c;就会出现404报错 2、产生原因&#xff1a;我们打开react/vue打包后生成的dist文件夹&#xff0c;可以看到只有一…

基于MATLAB的直流无刷电机速度控制

作品简介 基于MATLAB的直流无刷电机速度控制 仿真平台&#xff1a;Matlab 仿真结果为&#xff1a;

npm报错,显示certificate has expired

从报错信息就可以知道是因为之前设置的淘宝镜像已过期&#xff0c;解决方法就是要把之前设置的淘宝镜像改成新的 第一种方法 第一步&#xff1a;清空缓存 npm cache clean --force第二步&#xff1a;重新设置新的镜像源 npm config set registry https://registry.npmmirror…

django-q轻量级定时任务制定

django-q ,celery&#xff0c;apschedule都可以作为python的选型&#xff0c;但是django-q更轻量级&#xff0c;可以定制想要的任务&#xff0c;通过消息中间件&#xff0c;来实现不太高并发的实现 官网介绍地址 django-q官网地址 本次测试的是python3.12版本 首先需要安装dja…

QT 如何防止 QTextEdit 自动滚动到最下方

在往QTextEdit里面append字符串时&#xff0c;如果超出其高度&#xff0c;默认会自动滚动到QTextEdit最下方。但是有些场景可能想从文本最开始的地方展示&#xff0c;那么就需要禁止自动滚动。 我们可以在append之后&#xff0c;添加如下代码&#xff1a; //设置编辑框的光标位…

华为配置WLAN外置Portal认证实验

华为配置WLAN外置Portal认证示例 组网图形 图1 配置WLAN外置Portal认证示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤 业务需求 某企业为了提高WLAN网络的安全性&#xff0c;采用外置Portal认证方式&#xff0c;实现对用户的接入控制。 组网需求 AC组…

论文阅读——Align before Fuse

Align before Fuse: Vision and Language Representation Learning with Momentum Distillation image-text contrastive learning(ITC)用在单模态&#xff0c;masked language modeling (MLM) and image-text matching (ITM) 用在多模态。 单模态编码器的表示上引入了中间图像…

如何在Windows 10上打开和关闭平板模式?这里提供详细步骤

前言 默认情况下&#xff0c;当你将可翻转PC重新配置为平板模式时&#xff0c;Windows 10会自动切换到平板模式。如果你希望手动打开或关闭平板模式&#xff0c;有几种方法可以实现。​ 自动平板模式在Windows 10上如何工作 如果你使用的是二合一可翻转笔记本电脑&#xff0…

常见的十大网络安全攻击类型

常见的十大网络安全攻击类型 网络攻击是一种针对我们日常使用的计算机或信息系统的行为&#xff0c;其目的是篡改、破坏我们的数据&#xff0c;甚至直接窃取&#xff0c;或者利用我们的网络进行不法行为。你可能已经注意到&#xff0c;随着我们生活中越来越多的业务进行数字化&…