gpt4 book ai didi

rust - 基于 lambda 的迭代器的生命周期

转载 作者:行者123 更新时间:2023-12-04 07:30:38 25 4
gpt4 key购买 nike

我的问题似乎与Rust error "cannot infer an appropriate lifetime for borrow expression" when attempting to mutate state inside a closure returning an Iterator密切相关,但我认为不一样。所以这

use std::iter;                                                                  

fn example(text: String) -> impl Iterator<Item = Option<String>> {
let mut i = 0;
let mut chunk = None;
iter::from_fn(move || {
if i <= text.len() {
let p_chunk = chunk;
chunk = Some(&text[..i]);
i += 1;
Some(p_chunk.map(|s| String::from(s)))
} else {
None
}
})
}

fn main() {}
不编译。编译器说它无法确定 &text[..i] 的适当生命周期.这是我能想到的最小的例子。这个想法是,有一个内部状态,它是 text 的一个切片。 ,并且迭代器返回从该内部状态分配的新字符串。我是 Rust 的新手,所以也许这很明显,但是我将如何注释生命周期以便编译?
请注意,此示例与链接示例不同,因为有 point被作为引用传递,而这里 text被移动。此外,答案现在已经有一年半的历史了,所以也许有更简单的方法。
编辑:已添加 p_chunk强调 chunk需要在对 next 的调用中保持持久性所以不能是闭包的本地,但应该被它捕获。

最佳答案

您的代码是尝试创建 self-referential struct 的示例。 ,其中结构是由闭包隐式创建的。由于两者 textchunk移动到闭包中,您可以将它们视为结构的成员。如 chunk引用text中的内容,结果是一个自引用结构,当前借用检查器不支持该结构。
虽然自引用结构由于移动而通常是不安全的,但在这种情况下它是安全的,因为 text是堆分配的,随后不会发生变异,也不会逃脱闭包。所以text的内容不可能移动,一个足够聪明的借用检查器可以证明你正在尝试做的事情是安全的,并允许闭包编译。

The answer to the [linked question] says that referencing through an Option is possible but the structure cannot be moved afterwards. In my case, the self-reference is created after text and chunk were moved in place, and they are never moved again, so in principle it should work.


同意 - 原则上它应该可以工作,但众所周知,当前的借用检查器不支持它。支持需要多个新功能:借用检查器应该像 Box 这样的特殊情况堆分配类型或 String其移动不会影响对其内容的引用,并且在这种情况下也证明您没有调整大小或 mem::replace()封闭式 String .
在这种情况下,最好的解决方法是“明显”的解决方法:而不是保留 chunk切片,坚持一对 usize索引(或 Range )并在需要时创建切片。

关于rust - 基于 lambda 的迭代器的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67956773/

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