我用的是这个代码:

// input is an arg here

let players: Option<Vec<Player>>;

if let Some(players_to_create) = input.players_to_create {
    players = Some(
        players_to_create
            .iter()
            .map(|o| Player::new(&o.id, &o.team_id, &o.name)?)
            .collect(),
    )
}

但我得到了这样一个错误:

error[E0277]: the `?` operator can only be used in a closure that returns `Result` or `Option` (or another type that implements `std::ops::FromResidual`)
   |
61 | ...                   .map(|o| {
   |                            --- this function should return `Result` or `Option` to accept `?`
...
67 | ...                       )?
   |                            ^ cannot use the `?` operator in a closure that returns `Player`
   |
   = help: the trait `std::ops::FromResidual<std::result::Result<std::convert::Infallible, common::error::Error>>` is not implemented for `Player`

如果我删除?,我会得到以下错误:

error[E0277]: a value of type `std::vec::Vec<Player>` cannot be built from an iterator over elements of type `std::result::Result<Player, common::error::Error>`
     |
59   | / ...                   players_to_create
60   | | ...                       .iter()
61   | | ...                       .map(|o| {
62   | | ...                           Player::new(
...    |
67   | | ...                           )
68   | | ...                       })
     | |____________________________^ value of type `std::vec::Vec<Player>` cannot be built from `std::iter::Iterator<Item=std::result::Result<Player, common::error::Error>>`
69   |   ...                       .collect(),
     |                              ------- required by a bound introduced by this call
     |
     = help: the trait `std::iter::FromIterator<std::result::Result<Player, common::error::Error>>` is not implemented for `std::vec::Vec<Player>`
     = help: the trait `std::iter::FromIterator<T>` is implemented for `std::vec::Vec<T>`
note: required by a bound in `std::iter::Iterator::collect`
     |
1832 |     fn collect<B: FromIterator<Self::Item>>(self) -> B
     |                   ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `std::iter::Iterator::collect`

你能帮我理解一下吗?

推荐答案

您可以使用okResult转换为Option.然后你有一个Iterator<Item = Option<Player>>,可以直接收集到一个Option<Vec<Player>>中:

players = 
    players_to_create
    .iter()
    .map(|o| Player::new(&o.id, &o.team_id, &o.name).ok())
    .collect();

或者,您可以将player的类型更改为Result<Vec<Player>, ???>(将???替换为实际的错误类型),然后直接收集到该类型:

let players: Result<Vec<Player>, _> =
    players_to_create
    .iter()
    .map(|o| Player::new(&o.id, &o.team_id, &o.name))
    .collect();

Rust相关问答推荐

两个相关特征的冲突实现错误

获取字符串切片(&;str)上的切片([ia..ib])返回字符串

同时从不同线程调用DLL的不同函数会出现分段错误或产生STATUS_STACK_BUFFER_OVERRUN

在macro_rule中拆分模块和函数名

借来的价值生命周期 不够长,不确定为什么它仍然是借来的

为什么 js_sys Promise::new 需要 FnMut?

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

为什么我可以使用 &mut (**ref) 创建两个实时 &mut 到同一个变量?

Rust 打包在 .deb 中

str 和 String 的 Rust 生命周期

Some(v) 和 Some(&v) 有什么区别?

从 HashMap>, _> 中删除的生命周期问题

为什么 i32 Box 类型可以在 Rust 中向下转换?

Rust 引用元组和引用元组

具有生命周期和以后引用的可变方法

隐式类型闭包的错误生命周期推断

TinyVec 如何与 Vec 大小相同?

如何从 many0 传播 Nom 失败上下文?

Rust 中的运行时插件

如何从 Rust 应用程序连接到 Docker 容器中的 SurrealDB?