在下面的 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()
}
我收到此错误:
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
Adding mut
按照编译器的建议解决了这个问题。.
我不明白为什么需要它。不需要在main
当我打电话时it1.map
.
我不明白错误消息。
-
the `map` method cannot be invoked on a trait object
通过添加解决mut
到特质参考。这似乎是矛盾的。
- 有关消息如何
Sized
与错误相关的特征界限?
The "map
无法在特征对象上调用方法” and “这有一个Sized https://doc.rust-lang.org/std/marker/trait.Sized.html要求”错误消息是因为map() https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.map consumes原始迭代器。dyn Traits https://doc.rust-lang.org/reference/types/trait-object.html?highlight=dyn#trait-objects不能被消耗(它们是unsized类型并且不能按值传递给函数)。
它适用于it1
因为1)它不是一个特征对象,它是一个具体类型Iter https://doc.rust-lang.org/std/slice/struct.Iter.html2)它不是一个参考,所以它被消耗了。
原因是&mut dyn Iterator
有效是因为。有效的区别只是引用被消耗并且底层迭代器被改变。
如果你想遵循惯例,我会做scale_it_iter
consume迭代器像这样:
fn scale_it_iter<'a>(l: impl Iterator<Item = &'a i32>) -> Vec<i32> {
l.map(|x| x * 2).collect()
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)