我有一个函数,它接受一个引用结构体的迭代器。有时我遍历一个向量,这很好,但有时我创建一个产生新结构体的迭代器,我很难弄清楚这个问题。我知道当我在闭包中创建一个值时,它会在闭包结束时消失。Rust总是试图将我不想移动的值从东西中移出来;为什么这里不这样做呢?
struct Thing {
value: u32,
}
fn consume<'a, I: IntoIterator<Item = &'a Thing>>(things: I) {
for thing in things {
println!("{}", thing.value);
}
}
fn main() {
let solid = vec![Thing { value: 0 }];
let ephemeral = (1..5).map(|i| &Thing { value: i }); // Boxing Thing does not work either
consume(solid.iter());
consume(ephemeral);
}
但是。
error[E0515]: cannot return reference to temporary value
--> src/main.rs:13:36
|
13 | let ephemeral = (1..5).map(|i| &Thing { value: i }); // Boxing Thing does not work either
| ^------------------
| ||
| |temporary value created here
| returns a reference to data owned by the current function
我感觉我需要将结构体从闭包和迭代器中移出,或者将其存储在其他地方。但是将结构体放入Box
中不起作用,返回结构体而不是指针无法通过类型检查(我找不到.cloned()
的相反方法)。这里的方法是什么?
Iterator
特质不允许您返回对迭代器本身拥有的某些内容的引用。即使更改了特质(或创建了替代特质),它也将具有大量限制。当前的抽象在更多上下文中更适用(和可理解)。 - Shepmaster