如何获得对向量中找到的项目的可变引用?
如果我不使用.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}`?
答案 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的一项重要规则是多个东西不能同时拥有对项目的可变引用。您的非可变案例有效,因为 允许对项目进行多次不可变引用。