我想要做
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我基本上正在做这个问题的答案建议的事情。
我应该如何生成这个向量?
如果你忽略了部分
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。
| 归档时间: |
|
| 查看次数: |
4634 次 |
| 最近记录: |