在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); }
错误原因分析
原代码有两个核心问题:
- 变量未初始化:
let mut v: Vec<S>;仅声明了变量但未赋值,Rust禁止使用未初始化变量。 - 闭包参数写法错误:
v.iter_mut()返回的迭代器元素类型是&mut S(可变引用)。Iterator::find方法的闭包参数是迭代器元素的引用,也就是&&mut S(对可变引用的引用)。- 你写的
|&&x|试图两次解引用&&mut S,但&mut S不可复制,无法通过二次解引用获取S的值,同时编译器期望处理可变引用类型,这种写法得到的类型不匹配,触发E0308错误。
正确闭包参数写法及原因
以下三种写法都可行,本质都是正确处理&&mut S类型的参数:
写法1:
|x| (*x).s == cmpx的类型是&&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
相关产品推荐
相关产品推荐

