You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Rust中&符号在闭包参数中会复制引用指向的值?

闭包参数中&x的解构逻辑:模式匹配在起作用

这是Rust模式匹配的核心特性,和你理解的ref逻辑正好相反,拆解来看:

1. 先明确Option::filter的闭包参数类型

Option::filter的设计是不获取所有权,它会把内部值以引用的形式传给闭包——对于Option<u8>来说,闭包收到的参数类型是&u8。

2. 两种闭包参数的区别

  • |x|的情况:x直接绑定到传入的&u8引用上,所以x的类型就是&u8,和你预期的一致。
  • |&x|的情况:这里的&是模式的一部分,作用是解构传入的引用——它会自动解引用并复制(因为u8实现了Copy trait)引用背后的值,把这个自有值绑定到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 = &num;

// 直接绑定引用
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:10:26