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

在Rust中如何在iter_mut上使用find()并解决编译错误

修正后的代码及解释

可编译的完整代码

struct S {
    s: String
}

fn main() {
    // 必须初始化v,Rust不允许使用未初始化变量
    let mut v = vec![S { s: "asdf".to_string() }];
    let cmp = "asdf";
    
    // 三种正确写法任选其一
    let result = v.iter_mut().find(|x| (*x).s == cmp);
    // let result = v.iter_mut().find(|&x| x.s == cmp);
    // let result = v.iter_mut().find(|x| x.s == cmp);
}

错误原因分析

原代码有两个核心问题:

  1. 变量未初始化:let mut v: Vec<S>;仅声明了变量但未赋值,Rust禁止使用未初始化变量。
  2. 闭包参数写法错误:
    • v.iter_mut()返回的迭代器元素类型是&mut S(可变引用)。
    • Iterator::find方法的闭包参数是迭代器元素的引用,也就是&&mut S(对可变引用的引用)。
    • 你写的|&&x|试图两次解引用&&mut S,但&mut S不可复制,无法通过二次解引用获取S的值,同时编译器期望处理可变引用类型,这种写法得到的类型不匹配,触发E0308错误。

正确闭包参数写法及原因

以下三种写法都可行,本质都是正确处理&&mut S类型的参数:

  • 写法1:|x| (*x).s == cmp
    x的类型是&&mut S,通过*x解引用一次得到&mut S,即可正常访问s字段。

  • 写法2:|&x| x.s == cmp
    利用模式匹配剥离外层的&,x的类型变为&mut S,可以直接访问s字段,写法更简洁。

  • 写法3:|x| x.s == cmp
    Rust的自动解引用特性会在访问结构体字段时自动处理一层解引用,因此可以省略显式的*x,这是最简洁的写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:19:21