如何获得向量中找到的项目的可变引用?
我已经尝试了下面的工作,如果我不使用迭代器可变.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)
我收到以下错误:
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
我也尝试使闭包中的类型可变,|&mut c|但是会出现以下错误:
Run Code Online (Sandbox Code Playgroud)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}`?
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的一个重要规则是多个事物不能同时拥有对项目的可变引用.你不可变的情况下工作,因为你被允许有一个项目多不可变的引用.
| 归档时间: |
|
| 查看次数: |
442 次 |
| 最近记录: |