考虑这个片段:

fn main() {
    let arr_of_arr = [[1, 2], [3, 4]];
    let res = arr_of_arr
        .iter()
        .flat_map(|arr| arr.iter())
        .collect::<Vec<i32>>();
}

编译器错误是:

error[E0277]: the trait bound `std::vec::Vec<i32>: std::iter::FromIterator<&{integer}>` is not satisfied
 --> src/main.rs:6:10
  |
6 |         .collect::<Vec<i32>>();
  |          ^^^^^^^ a collection of type `std::vec::Vec<i32>` cannot be built from an iterator over elements of type `&{integer}`
  |
  = help: the trait `std::iter::FromIterator<&{integer}>` is not implemented for `std::vec::Vec<i32>`

为什么这个片段不能编译?

特别是,我无法理解错误消息:什么类型代表&{integer}

推荐答案

如果编译器知道某个类型是整型,但它不知道它使用的是整型.

问题是,您试图将一系列"对整数的引用"收集到一系列"整数".要么更改为Vec<&i32>,要么取消对迭代器中元素的引用.

fn main() {
    let arr_of_arr = [[1, 2], [3, 4]];
    let res = arr_of_arr.iter()
        .flat_map(|arr| arr.iter())
        .cloned() // or `.map(|e| *e)` since `i32` are copyable
        .collect::<Vec<i32>>();
}

Rust相关问答推荐

捕获Rust因C++异常而产生panic

通用池类型xsx

关联类型(类型参数)命名约定

borrow 和内部IntoIterator

有没有办法模仿对象安全克隆?

如何将像烫手山芋一样不透明的值从一个Enum构造函数移动到下一个构造函数?

如何在函数中返回自定义字符串引用?

从未排序的链表中删除重复项的铁 rust 代码在ELSE分支的低级上做了什么?

将一个泛型类型转换为另一个泛型类型

如何在AVX2中对齐/旋转256位向量?

如何返回 struct 体中向量的切片

Rust Option 的空显式泛型参数

Nom 解析器无法消耗无效输入

try 从标准输入获取用户名和密码并删除 \r\n

当推送到 HashMap 中的 Vector 时,类型 `()` 无法取消引用

为什么可以在迭代器引用上调用 into_iter?

为什么1..=100返回一个范围而不是一个整数?

为什么会出现无法移出可变引用后面的 `self.x`错误?

TinyVec 如何与 Vec 大小相同?

当引用不再被borrow 时,Rust 不会得到它