为何Rust中&符号在闭包参数中会复制引用指向的值?
闭包参数中
&x的解构逻辑:模式匹配在起作用 这是Rust模式匹配的核心特性,和你理解的ref逻辑正好相反,拆解来看:
1. 先明确Option::filter的闭包参数类型
Option::filter的设计是不获取所有权,它会把内部值以引用的形式传给闭包——对于Option<u8>来说,闭包收到的参数类型是&u8。
2. 两种闭包参数的区别
|x|的情况:x直接绑定到传入的&u8引用上,所以x的类型就是&u8,和你预期的一致。|&x|的情况:这里的&是模式的一部分,作用是解构传入的引用——它会自动解引用并复制(因为u8实现了Copytrait)引用背后的值,把这个自有值绑定到x上,相当于执行了:let input: &u8 = /* filter传入的引用 */; let &x = input; // x的类型是u8
3. 和ref的区别
别把&模式和ref搞混:
ref是在模式中创建引用:比如|ref x|,会把传入的&u8再套一层引用,x的类型是&&u8。&是在模式中解构引用:把传入的引用“拆开来”,取出内部的值(Copy类型直接复制,非Copy类型则需要满足移动条件)。
4. 更直观的非闭包示例
用普通的let绑定就能看明白这个逻辑:
let num: u8 = 42; let num_ref: &u8 = # // 直接绑定引用 let a = num_ref; // a: &u8 // 解构引用,复制值 let &b = num_ref; // b: u8 // ref模式,生成新引用 let ref c = num_ref; // c: &&u8
5. 官方文档依据
Rust官方文档的模式匹配章节中,「引用模式」部分明确说明了:
- 使用
&前缀的模式可以解构一个引用,将匹配的值绑定到模式的其余部分。 - 而
ref关键字则用于在模式内部创建引用,避免值被移动或复制。
你之前没遇到可能是因为大多场景下要么直接用引用,要么用*x手动解引用,这种模式匹配的写法更简洁,但本质和手动解构是一样的。
内容的提问来源于stack exchange,提问作者phip1611
相关产品推荐
相关产品推荐

