相关疑难解决方法(0)

iter和into_iter有什么区别?

我正在做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)

rust

117
推荐指数
4
解决办法
2万
查看次数

使用Iterator collect键入问题

我正在尝试使用以下代码片段将对矢量转换&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()修复这个问题.

iterator rust

16
推荐指数
1
解决办法
8832
查看次数

使用 FlatMap 迭代器时,为什么我会收到错误 FromIterator&lt;&amp;{integer}&gt; is not implementation for Vec&lt;i32&gt; ?

考虑这个片段:

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}

rust

9
推荐指数
1
解决办法
3918
查看次数

将&T的迭代器收集到T的集合中的惯用方式是什么?

我需要将遍历&strs 的迭代器收集到&strs 的集合中。问题是迭代器产生&&strs。

我尝试将from映射&wordword,尽管它可以正常工作,但我不知道它是否被认为是好的,或者是否有更好的选择。

问题:

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)

操场

iterator reference rust

4
推荐指数
2
解决办法
109
查看次数

标签 统计

rust ×4

iterator ×2

reference ×1