从文字创建 Vec<String>

tur*_*too 6 rust

我想要做

fn main() {
    let options: Vec<String> = vec!["a", "b", "c"].map(|s| s.to_owned()).collect();
}
Run Code Online (Sandbox Code Playgroud)

因为这似乎是获取拥有的向量的最简单方法String,但我遇到了这个错误:

fn main() {
    let options: Vec<String> = vec!["a", "b", "c"].map(|s| s.to_owned()).collect();
}
Run Code Online (Sandbox Code Playgroud)

我不明白边界的需要从何[&str] : std::iter::Iterator而来。如果您忽略这部分,split_whitespace我基本上正在做这个问题的答案建议的事情。

我应该如何生成这个向量?

She*_*ter 9

如果你忽略了部分split_whitespace

是的,但你不能忽略这一部分。状态文档split_whitespace(重点是我的):

迭代器返回

split_whitespace返回由空格分隔的字符串片段上的迭代器,并且map是 上的方法Iterator

AVec不是迭代器。你可以看到它Vec没有实现它自己的map方法:

map未找到该类型名为的方法std::vec::Vec<&str>

编译器尝试建议您可能的意思,但没有完全实现:

注意:该方法map存在,但不满足以下特征边界:

Vec您可以通过调用Vec::iter或从 a 获取迭代器into_iter

fn main() {
    let options: Vec<String> = vec!["a", "b", "c"].into_iter().map(|s| s.to_owned()).collect();
}
Run Code Online (Sandbox Code Playgroud)

但是,这里不需要分配两个向量,一个数组和一个向量更有效:

let options: Vec<_> = ["a", "b", "c"].iter().map(|s| s.to_string()).collect();
Run Code Online (Sandbox Code Playgroud)

切片上的迭代器返回对&T切片中元素的引用 ( )。由于每个元素已经是 a &str,因此 的类型s是 a &&str。调用to_owned对引用的引用只是克隆该引用。您也可以这样说.map(|&s| s.to_owned()),它取消引用该值一次,生成一个&str. 调用to_owneda&str会分配 a String