rust 使用?on &Result〈T,String>

ndasle7k  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(131)

为什么我会得到这个错误以及如何修复它?这是我如何得到temp:let temp = self.value.clone().iter().map(|x| self.parse(x.to_string())).collect::<Vec<Result<T, String>>>();它只是将一个字符串解析为T。

Ok(temp.iter().map(|x: &Result<T, String> | x?).collect::<Vec<T>>())
the `?` operator cannot be applied to type `&Result<T, String>`
    |
    = help: the trait `Try` is not implemented for `&Result<T, String>`
    = help: the trait `Try` is implemented for `Result<T, E>

这是一个有效的修复,但上面的Map也应该有效。

let mut res = vec![];
        for v in temp {
            res.push(v?);
        }
        Ok(res)
z3yyvxxp

z3yyvxxp1#

出现此错误是因为不能将?Result s的引用一起使用。
但是如果你有Result s,你所写的也不起作用,因为?-operator early从最里面的函数(这里是闭包)返回,而你可以使用as_ref&Result<T, String>转换为Result<&T, &String>,并将collect转换为Result

pub fn foo<T>(temp: &[Result<T, String>]) -> Result<Vec<&T>, String> {
    Ok(temp.iter().map(|x| x.as_ref()).collect::<Result<Vec<_>, _>>()?)
}

相关问题