#[derive(Debug)]
struct S{}
#[derive(Debug)]
struct E{}
fn test() -> Result<S, E> {
let data_1: Result<S, E> = Ok(S{});
let data_2: Result<S, E> = Err(E{});
let v: Vec<Result<S, E>> = vec![data_1, data_2];
for i in 1..2 {
for item in &v {
let val = item?; //error
println!("{:?}", val);
};
}
Ok(S{})
}
在上面的代码中,如果结果为“Ok”(否则返回“Err”),我想打印该项的值。但由于将一个值移到共享引用之后,在
(*item)?
部分出现错误:``` [rustc E0507] [E] cannot move out of `*item` which is behind a shared reference move occurs because `*item` has type `std::result::Result`, which does not implement the `Copy` trait ```
我尝试过克隆数据,但它并没有解决问题。此外,克隆并不正确。
有什么正确的解决方法/最佳实践吗?
Item = &Result<S, E>
的迭代器。如果我没记错,您可以通过使用方法(as_ref
)将其转换为Result<&S, &E>
。那么直接对每个项目进行模式匹配如何呢?if let Ok(val) = item { ... }
- E net4for item in v
,因为该循环实际上嵌套在另一个循环内部。因此,这样做会导致“使用已移动的值:“v”。值在前一次循环迭代中移动到此处”错误。 - Pahlevi Fikri Auliyav
的函数,因此无法按值迭代它,您可以使其返回Result<S, &E>
(其中S
在函数内部创建,&E
是对参数的引用)。如果v
在函数内部创建,但您想多次迭代它,则不知道是否有意义避免克隆E
。 - trentVec<Result<S, E>>
,如果其中任何一个是Err
,则返回Err
,然后使用Vec<S>
继续进行算法的其余部分?这听起来是合理的(尽管这引出了为什么首先有Result
的Vec
的问题)。 - trent