当前位置: 首页 > news >正文

Rust中的一些细枝末节

Rust中的&解引用。

 let v3 = Some('a');match v3.as_ref() {Some(&c) => {let addr = std::ptr::addr_of!(c);println!("addr of c: {:?}", addr);println!("addr of v3: {:?}", ptr::addr_of!(v3));}None => {}}let v5: Option<i32> = Some(10);match v5.as_ref() {Some(c) => {let addr = std::ptr::addr_of!(c);println!("addr of c: {:?}", addr);println!("addr of v4: {:?}", ptr::addr_of!(v5));}_ => {}}let v4 = Some(10);match v4.as_mut() {Some(&mut c) => { c=20;//编译失败,报错:无法对C的值赋值两次}_ => {}}

代码如上,v3和v5都能编译通过,但打印的值却不同。
v3中 解引用出来的变量c和v3的地址不是同一个,v5中c的值和v5的地址是同一个。在v3中Some(&c),做了两件事,一:解引用,使用Some(&c)匹配v3.as_ref()。二:将v3中的值赋值到变量c中,因为char类型实现了Copy trait,因此可以直接赋值,这也就导致了c和v3的地址不是同一个(因为发生了拷贝)。而v5中的c就代表了&i32,只是将i32的引用进行了赋值,因此他们指向的地址还是同一个。

v4中编译失败,理解了v3中赋值的问题不难理解。Some(&mut c)实现了解引用和赋值,但赋值后的c和v4中的值已经不是一个地址了,因此在编译层面直接就不通过(不符合可变性规则)。重新分析v4的逻辑不难发现,无非就是要修改v4中的值,此时就可以直接Some(c), 此时的c的类型为v4值的可变引用(&mut i32),指向了v4中的值的地址,因此可以直接修改。

http://www.jsqmd.com/news/564863/

相关文章:

  • ChatRTX性能优化终极指南:提升推理速度的10个技巧
  • 别再死记硬背MAML原理了!用PyTorch手撸一个Omniglot小样本分类器(附完整代码)
  • 教师工具箱 (Teacher Toolbox) 开源架构解析:双JSON驱动的模块化设计
  • 小白程序员必看:收藏这份 Agent 智能体指南,解锁未来 AI 生产力革命
  • 终极指南:快速掌握CyberChef网络安全工具箱
  • 飞塔防火墙Link Monitor功能实战:配置与故障排除指南
  • Verilog实战:高效利用for循环实现硬件逻辑综合
  • 智慧课堂项目面试复习资料
  • 千问3.5-2B在科研场景落地:论文插图数据提取+图表趋势文字化描述
  • 提升运维效率:用快马ai打造自动化c盘清理与监控方案
  • LuckFox RK3576开发实战:从VSCode远程连接到ADB调试,一条龙搞定嵌入式应用开发
  • 3步搞定Axure中文界面:让原型设计工具说你的母语
  • 2026-03-31:三元素表达式的最大值。用go语言,从数组 nums 中任选三个下标互不相同的元素,设这三个元素分别为 a、b、c(对应的下标不能重复)。 计算表达式 a + b - c,希望让它
  • Topit:通过窗口层级控制技术实现Mac高效窗口管理
  • Ubuntu20.04下Boost安装避坑指南:解决Python路径报错问题
  • 桥梁损伤分割数据集YHT3261-5类 YOLOv8分割模型。桥梁损伤分割数据集 钢筋外露、混凝土剥落、裂缝、钢筋锈蚀、结构变形
  • 如何利用anyRTC-RTMP-OpenSource实现高效图片推流:特殊场景下的完美替代方案
  • Spring Boot项目里,Apollo配置变了怎么自动刷新业务缓存?手把手教你写ConfigListener
  • BEVFormer v2实战指南:如何用透视监督提升3D目标检测性能(附NuScenes数据集测试)
  • ESP32 I2S接口实战:驱动OV7670摄像头(无FIFO)并实现网页实时监控
  • Keepalived常见配置陷阱:为什么你的两台服务器都获得了VIP?
  • Windows下C++11多线程环境搭建:最新MinGW-w64安装配置全流程(附环境变量设置避坑点)
  • ollama v0.19.0 发布!Web 搜索插件上线、多模型兼容修复、MLX 与 KV 缓存全面优化,本地大模型体验再升级
  • 终极指南:NGINX Ingress Controller自定义配置全解析——从Annotations到ConfigMaps
  • 如何彻底摆脱网盘下载限制:免费获取八大平台直链下载地址的完整指南
  • Phi-4-mini-reasoning在科研场景应用:论文公式推导与算法验证辅助实践
  • 【专栏一:AI基础08】-【一张图讲清楚:RAG的原理(从“查资料”到“生成答案”全过程)】
  • GME-Qwen2-VL-2B-Instruct快速上手:Anaconda科学计算环境配置
  • 高级java每日一道面试题-2025年9月23日-企业集成篇[LangChain4j]-如何与现有的企业中间件集成(Kafka、RabbitMQ)?
  • Illustrator脚本大全:30+免费工具让你的设计效率翻倍