gpt4 book ai didi

rust - 为什么将 mut 添加到传递的 Iterator 引用可以解决这个问题?

转载 作者:行者123 更新时间:2023-12-03 11:23:53 28 4
gpt4 key购买 nike

在以下 Rust 片段中:

fn main() {
let list1: Vec<i32> = vec![0, 1, 2, 3, 4];

let it1 = list1.iter();
let tens = it1.map(|x| x * 10).collect::<Vec<i32>>();
println!("{:?}", tens);

let it2 = list1.iter();
let doubled_from_iter = scale_it_iter(&it2);

println!("{:?}", doubled_from_iter);
}

fn scale_it_iter(l: &dyn Iterator<Item = &i32>) -> Vec<i32> {
l.map(|x| x * 2).collect()
}
Rust Playground Link
我收到此错误:
error: the `map` method cannot be invoked on a trait object
--> src/main.rs:15:7
|
15 | l.map(|x| x * 2).collect()
| ^^^
|
::: /home/xolve/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/iter/traits/iterator.rs:625:15
|
625 | Self: Sized,
| ----- this has a `Sized` requirement
|
= note: you need `&mut dyn Iterator<Item = &i32>` instead of `&dyn Iterator<Item = &i32>`

error: aborting due to previous error
添加 mut正如编译器所建议的那样解决了这个问题。 Rust Playground link for working code .
我不明白为什么需要它。在 main 中不需要它当我打电话时 it1.map .
我不明白错误信息。
  • the `map` method cannot be invoked on a trait object通过添加 mut 解决到特征引用。这似乎是矛盾的。
  • 关于Sized的消息如何?与错误相关的特征界限?
  • 最佳答案

    map 方法不能在特征对象上调用”和“这有一个 Sized 要求”错误消息是因为 map() 消耗原始迭代器。 dyn Trait s不能被使用(它们是未定义大小的类型,不能按值传递给函数)。
    它适用于 it1因为 1) 它不是一个 trait 对象,它是一个具体类型 Iter 和 2)它不是引用,所以它被消耗了。
    原因&mut dyn Iterator作品是因为 &mut dyn Iterator implements Iterator .有效的区别只是引用被消耗并且底层迭代器发生了变化。

    如果你想遵循惯例,我会做 scale_it_iter像这样使用迭代器:

    fn scale_it_iter<'a>(l: impl Iterator<Item = &'a i32>) -> Vec<i32> {
    l.map(|x| x * 2).collect()
    }

    关于rust - 为什么将 mut 添加到传递的 Iterator 引用可以解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65753865/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com