我正在做Rust示例教程,其中包含以下代码片段:
// Vec example
let vec1 = vec![1, 2, 3];
let vec2 = vec![4, 5, 6];
// `iter()` for vecs yields `&i32`. Destructure to `i32`.
println!("2 in vec1: {}", vec1.iter() .any(|&x| x == 2));
// `into_iter()` for vecs yields `i32`. No destructuring required.
println!("2 in vec2: {}", vec2.into_iter().any(| x| x == 2));
// Array example
let array1 = [1, 2, 3];
let array2 = [4, 5, 6];
// `iter()` for arrays yields `&i32`.
println!("2 in array1: {}", array1.iter() …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下代码片段将对矢量转换&str为a HashMap:
use std::collections::HashMap;
fn main() {
let pairs = vec!(("foo", "bar"), ("toto", "tata"));
let map: HashMap<&str, &str> = pairs.iter().collect();
println!("{:?}", map);
}
Run Code Online (Sandbox Code Playgroud)
但是编译失败并出现此错误:
<anon>:5:47: 5:56 error: the trait `core::iter::FromIterator<&(&str, &str)>` is not implemented for the type `std::collections::hash::map::HashMap<&str, &str>` [E0277]
<anon>:5 let map: HashMap<&str, &str> = pairs.iter().collect();
Run Code Online (Sandbox Code Playgroud)
但是,如果我.cloned()在调用之前添加collect()一切正常:
...
let map: HashMap<&str, &str> = pairs.iter().cloned().collect();
...
Run Code Online (Sandbox Code Playgroud)
即使我理解错误消息(没有FromIterator<&(&str, &str)>该类型的特征的实现HashMap<&str, &str>)我不明白类型&(&str, &str)来自哪里(根据Rust文档中的方法签名)以及为什么调用cloned()修复这个问题.
考虑这个片段:
fn main() {
let arr_of_arr = [[1, 2], [3, 4]];
let res = arr_of_arr
.iter()
.flat_map(|arr| arr.iter())
.collect::<Vec<i32>>();
}
Run Code Online (Sandbox Code Playgroud)
编译器错误是:
fn main() {
let arr_of_arr = [[1, 2], [3, 4]];
let res = arr_of_arr
.iter()
.flat_map(|arr| arr.iter())
.collect::<Vec<i32>>();
}
Run Code Online (Sandbox Code Playgroud)
为什么这段代码不能编译?
特别是,我无法理解错误消息:什么类型代表&{integer}?
我需要将遍历&strs 的迭代器收集到&strs 的集合中。问题是迭代器产生&&strs。
我尝试将from映射&word到word,尽管它可以正常工作,但我不知道它是否被认为是好的,或者是否有更好的选择。
问题:
use std::collections::HashSet;
fn main() {
let words = &["hello", "world", "I'm", "a", "Rustacean!"];
let hashset = words.iter().collect::<HashSet<&str>>();
}
Run Code Online (Sandbox Code Playgroud)
use std::collections::HashSet;
fn main() {
let words = &["hello", "world", "I'm", "a", "Rustacean!"];
let hashset = words.iter().collect::<HashSet<&str>>();
}
Run Code Online (Sandbox Code Playgroud)
我的解决方案:
use std::collections::HashSet;
fn main() {
let words = &["hello", "world", "I'm", "a", "Rustacean!"];
let hashset = words.iter().map(|&w| w).collect::<HashSet<&str>>();
}
Run Code Online (Sandbox Code Playgroud)