gpt4 book ai didi

rust - 在 Rust 中从 Option> 生成 Option>

转载 作者:行者123 更新时间:2023-11-29 08:22:50 37 4
gpt4 key购买 nike

我正在尝试做相当于 Ruby 的 Enumerable.collect() 的事情在 Rust 中。

我有一个 Option<Vec<Attachment>>我想创建一个 Option<Vec<String>>从它,与String::new() None 情况下的元素引导。

#[derive(Debug)]
pub struct Attachment {
pub guid: Option<String>,
}

fn main() {
let ov: Option<Vec<Attachment>> =
Some(vec![Attachment { guid: Some("rere34r34r34r34".to_string()) },
Attachment { guid: Some("5345345534rtyr5345".to_string()) }]);

let foo: Option<Vec<String>> = match ov {
Some(x) => {
x.iter()
.map(|&attachment| attachment.guid.unwrap_or(String::new()))
.collect()
}
None => None,
};
}

编译器中的错误很明显:

error[E0277]: the trait bound `std::option::Option<std::vec::Vec<std::string::String>>: std::iter::FromIterator<std::string::String>` is not satisfied
--> src/main.rs:15:18
|
15 | .collect()
| ^^^^^^^ the trait `std::iter::FromIterator<std::string::String>` is not implemented for `std::option::Option<std::vec::Vec<std::string::String>>`
|
= note: a collection of type `std::option::Option<std::vec::Vec<std::string::String>>` cannot be built from an iterator over elements of type `std::string::String`

如果我还记得到目前为止我从文档中读到的内容,我无法为 struct 实现特征我不拥有。

我如何使用 iter().map(...).collect() 执行此操作?还是另一种方式?

最佳答案

你应该阅读并记住 Option 上的所有方法(和 Result )。这些在 Rust 中被如此普遍地使用,以至于了解现在的内容将极大地帮助您。

例如,您的match语句是Option::map .

既然您从未说过您不能转让String 的所有权,那么我会这样做。这将避免任何额外分配:

let foo: Option<Vec<_>> =
ov.map(|i| i.into_iter().map(|a| a.guid.unwrap_or_else(String::new)).collect());

请注意,我们不必在 Vec 中指定类型;可以推断。

你当然可以引入函数让它更简洁:

impl Attachment {
fn into_guid(self) -> String {
self.guid.unwrap_or_else(String::new)
}
}

// ...

let foo: Option<Vec<_>> = ov.map(|i| i.into_iter().map(Attachment::into_guid).collect());

如果您不想放弃 String 的所有权,您可以使用相同的概念,但使用字符串切片:

impl Attachment {
fn guid(&self) -> &str {
self.guid.as_ref().map_or("", String::as_str)
}
}

// ...

let foo: Option<Vec<_>> = ov.as_ref().map(|i| i.iter().map(|a| a.guid().to_owned()).collect());

在这里,我们必须使用Option::as_ref为了避免将 guid 移出 Attachment,然后使用 String::as_str 转换为 &str , 提供默认值。我们同样不获取 ovOption 的所有权,因此需要迭代引用,并最终分配新的 StringToOwned.

关于rust - 在 Rust 中从 Option<Vec<Custom>> 生成 Option<Vec<String>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41774423/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com