尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

rust 中ref和区别

rust 中ref和区别
📅 发布时间:2026/6/20 18:15:26
在 Rust 中,ref 关键字和 & 符号都与引用(reference)相关,但它们在使用场景和含义上有根本的区别:
  • & (引用符号) 用于创建引用或声明接收引用的类型。
  • ref (关键字) 用于模式匹配(如 let 绑定、for 循环、match 表达式)中,以改变绑定的方式,使其绑定到一个值的引用,而不是直接绑定到值本身。
 
1. & 符号:引用操作符
& 是最常见的创建引用的方式。
  • 创建不可变引用: let r = &value;
  • 创建可变引用: let mr = &mut value;
  • 在函数签名中指定参数类型: fn func(arg: &Type) {}
它是一个表达式操作符,作用于一个值(value)上。
 
2. ref 关键字:模式匹配修饰符
ref 关键字用在赋值(绑定)过程的左侧,即模式(pattern)中。它的作用是告诉编译器:“在这个特定的绑定中,我不想获取值的所有权或拷贝值,我只想得到这个值的引用。”
 
核心区别总结
 
特性& 符号ref 关键字
位置 表达式的右侧(值前面) 模式的左侧(变量名前面)
作用 创建一个新的引用 修改绑定的行为为“按引用绑定”
目的 借用数据 在解构(模式匹配)时避免所有权转移
 
使用场景示例
最能体现区别的场景是 let 绑定和 match 表达式。
 
示例一:let 绑定和解构
假设我们有一个元组 (i32, i32)。
let point = (1, 2);// 使用 & 创建引用(右侧)
let r = &point; 
// r 的类型是 &(i32, i32),它是一个指向 point 的引用。// 使用 ref 在模式匹配中获取内部元素的引用(左侧)
// 解构 point 元组,并将内部元素的引用绑定到 x 和 y
let (ref x, ref y) = point; 
// x 的类型是 &i32,y 的类型是 &i32。
// 注意:point 的所有权没有被移动。// 如果不使用 ref,所有权会被移动(如果 point 是可移动类型)或者发生拷贝(i32 是 Copy 类型)
let (x_val, y_val) = point; // 发生拷贝
// x_val 和 y_val 的类型是 i32
示例二:match 表达式
在 match 语句中,如果你想根据一个引用进行匹配,并且在匹配分支中仍然使用引用,你需要同时使用 & 和 ref。
 
#[derive(Debug)]
struct Person {name: String,age: u8,
}let person = Person { name: String::from("Alice"), age: 30 };// 匹配一个 &Person 类型的引用
match &person { // 在这里,如果你只写 name,你会得到一个 String 的引用 &String// 但如果你使用 ref name,你是在创建一个新的绑定 name,它的类型是 &String&Person { ref name, age } => {// person 的所有权没有被 moveprintln!("匹配到名字: {}", name);println!("Age: {}", age);}
}
结论
理解这两者的关键在于左右区别:
  • 当你需要创建一个指向已有数据的引用时,使用 &(放在值的右侧表达式中)。
  • 当你需要在解构数据时将绑定方式修改为按引用绑定时,使用 ref(放在模式的左侧变量名前)。

参考资料:

1. ref与&区别

 

相关新闻

  • 固定资产分类
  • 2025 年 11 月纯化水设备厂家权威推荐榜:生物制药/医疗器械/食品/化妆品/实验室/工业反渗透纯化水系统专业解析与高效解决方案
  • 什么是分布式操作系统?

最新新闻

  • 字节跳动招聘骗局与内部人才绞肉机完整内幕白皮书
  • Llama 3本地实战:从代码精读、微调到vLLM部署全链路
  • 3-4个月实战入门AI Agent:从LangChain到ReAct的完整路径
  • 终极指南:3步快速解决Unity游戏语言障碍的完整方案
  • Ubuntu 16.04 LEMP部署实战:老旧系统稳定运维指南
  • 几何核方法:在非欧域上构建Matérn核的数学原理与实践

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号