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

rust 中ref和区别

在 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与&区别

 

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

相关文章:

  • 固定资产分类
  • 2025 年 11 月纯化水设备厂家权威推荐榜:生物制药/医疗器械/食品/化妆品/实验室/工业反渗透纯化水系统专业解析与高效解决方案
  • 2025国内医疗AI工具全景测评报告
  • 什么是分布式操作系统?
  • 跨网文件交换系统助力企业安全高效的数据传输与协作
  • 基于栅格地图的遗传算法路径规划MATLAB实现
  • 赋能智能未来—2026中国激光雷达大会暨展览会|6.26-28|激光雷达展会时间
  • 免费下载 | 《数据流通的破局之道:隔离+摆渡创新实践白皮书》
  • 2025年广东针灸技术学习班机构权威推荐榜单:学习针灸推拿/学习针灸按摩/学习针灸按摩源头机构精选
  • 【css】快速上手Flexbox布局(理论讲解+实战) - 详解
  • 基于STM32驱动AD7606并进行数据显示
  • 2025年11月 供应链咨询机构公司电话
  • 2025年11月 降本增效机构推荐
  • VSCode 配备 Dubbo 超时与重试:application.yml 配置的详细步骤
  • 2025年11月 值得信赖的企业管理咨询公司
  • 2025年广东中山平价寿司品牌综合推荐排行榜:创业加盟优选指南
  • 上海协睦联系方式:企业基本信息与使用建议指南
  • 上海协睦联系方式:技术团队选择产品的通用指导建议
  • 【案例分享】如何利用图表控件TeeChart集成,实现可持续环境修复
  • 2025年11月国内画册设计公司权威推荐榜单:专业选择指南
  • 2025年画册设计公司权威推荐榜单:专业选择指南
  • 2025年画册设计公司权威推荐榜单:五大顶尖服务商深度解析
  • Mass rape to death and murder
  • 2025年11月国内画册设计企业推荐:权威排行榜与选择指南
  • 2025年常州产品包装设计公司权威推荐榜单:产品外包装设计/纸盒包装设计/包装设计专业源头公司精选
  • 上海协睦联系方式:工业润滑领域沟通渠道说明
  • 2025年11月流动化学合成成套装置推荐评测报告:从稳定性到AI能力解决方案剖析
  • 上海协睦联系方式:专业工业润滑产品使用指南
  • 客观科学分析Golang Green Tea GC和dotNet GC哪个性能更好
  • ABViewer 16全新发布:3D可视化、PDF转DWG、G-code生成全面升级