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

Rust的for..in循环中&符号的作用是什么?

Rust for循环中&符号的模式匹配逻辑

这是Rust的模式匹配语法设计,不是你对基础概念的理解有偏差。核心区分点是:&符号在表达式位置是取引用,在模式匹配位置是解构引用,而for关键字后面的变量声明位置,本身就是模式匹配的上下文。

原理拆解

首先你已知遍历&[i32]类型的切片时,迭代器每次产出的元素类型是&i32,两种写法的差异本质是对这个&i32值的处理方式不同:

  1. 第一种写法for item in list
    直接把迭代器产出的&i32值绑定到item变量上,所以需要手动加*解引用才能拿到i32类型的原值:
fn largest(list: &[i32]) -> i32 {
    let mut largest = list[0];
    for item in list {
        if *item > largest {
            largest = *item;
        }
    }
    largest
}
  1. 第二种写法for &item in list
    这里的&属于模式匹配的解构语法,含义是「匹配右边的&i32类型值,把引用指向的内部i32值绑定到item变量」,相当于自动完成了一次解引用匹配,所以item直接就是i32类型,不需要手动解引用:
fn largest(list: &[i32]) -> i32 {
    let mut largest = list[0];
    for &item in list {
        if item > largest {
            largest = item;
        }
    }
    largest
}

通用模式匹配示例

这种解构逻辑是Rust模式匹配的通用规则,不局限于for循环,你可以用普通的let语句复现同样的效果:

let num: i32 = 10;
let num_ref: &i32 = # // 表达式位置的&,取引用,num_ref类型是&i32
let &x = num_ref; // 模式位置的&,解构引用,x类型是i32,值为10

和枚举值的解构逻辑完全一致:

let opt = Some(5);
let Some(v) = opt else { panic!() }; // 解构Option,v的类型是i32,值为5

内容的提问来源于stack exchange,提问作者James Chung

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:09:01