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

时间:2018-01-31 20:36:37

标签: 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);
}

但是当我尝试使用可变迭代器.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);
}

我收到以下错误:

  
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

我还尝试使用|&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}`?

1 个答案:

答案 0 :(得分:6)

Rust .find将回调类型&Self::Item传递回来,并且由于您使用的是.iter_mut(),因此您创建了一个迭代器,其中每个项目都为&mut T。这意味着传递给find回调的类型为&&mut T。为了得到类型检查,你可以做任何一个

vec.iter_mut().find(|&&mut c| c == 2)

vec.iter_mut().find(|c| **c == 2)

第二个更好。

您获得的错误是因为您使用&c选择的中间地点会将c设置为值&mut T,并且Rust的一项重要规则是多个东西不能同时拥有对项目的可变引用。您的非可变案例有效,因为 允许对项目进行多次不可变引用。