在Rust中使用"find"对项目进行可变引用

tve*_*eeg 4 rust

如何获得向量中找到的项目的可变引用?

我已经尝试了下面的工作,如果我不使用迭代器可变.iter():

fn main() {
    let mut vec = vec![1, 2, 3, 4];
    let mut wrong = -1;

    let working = match vec.iter().find(|&c| *c == 2) {
        Some(c) => c,
        None => &wrong
    };

    println!("Result: {}", working);
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用可变迭代器获取可变引用时.iter_mut(),

fn main() {
    let mut vec = vec![1, 2, 3, 4];
    let mut wrong = -1;

    let mut error = match vec.iter_mut().find(|&c| *c == 2) {
        Some(c) => c,
        None => &mut wrong
    };

    println!("Result: {}", error);
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

error[E0507]: cannot move out of borrowed content
 --> src/main.rs:5:48
  |
5 |     let mut error = match vec.iter_mut().find(|&c| *c == 2) {
  |                                                ^-
  |                                                ||
  |                                                |hint: to prevent move, use `ref c` or `ref mut c`
  |                                                cannot move out of borrowed content
Run Code Online (Sandbox Code Playgroud)

我也尝试使闭包中的类型可变,|&mut c|但是会出现以下错误:

error[E0308]: mismatched types
 --> src/main.rs:5:48
  |
5 |     let mut error = match vec.iter_mut().find(|&mut c| *c == 2) {
  |                                                ^^^^^^ types differ in mutability
  |
  = note: expected type `&&mut {integer}`
             found type `&mut _`
  = help: did you mean `mut c: &&&mut {integer}`?
Run Code Online (Sandbox Code Playgroud)

log*_*yth 6

Rust's .find传递回调类型&Self::Item,因为你正在使用.iter_mut(),你已经创建了一个迭代器,每个项目都是&mut T.这意味着传递给你的find回调的类型是&&mut T.为了达到类型检查的目的,你可以做到

vec.iter_mut().find(|&&mut c| c == 2)
Run Code Online (Sandbox Code Playgroud)

要么

vec.iter_mut().find(|c| **c == 2)
Run Code Online (Sandbox Code Playgroud)

第二个是优选的.

你得到的错误是因为你通过使用选择的中间地位&c将设置c为值&mut T,并且Rust的一个重要规则是多个事物不能同时拥有对项目的可变引用.你不可变的情况下工作,因为你允许有一个项目多不可变的引用.