gpt4 book ai didi

rust - 借用检查器提示多次借用,而只有一次会发生

转载 作者:行者123 更新时间:2023-12-05 06:01:32 32 4
gpt4 key购买 nike

考虑以下代码(也是 available on the playground )

pub trait TextStream {
fn next_str(&mut self) -> Option<&str>;
}

pub struct FilterTextStream<T: TextStream> {
inner: T,
maxlen: usize,
}

impl<T: TextStream> TextStream for FilterTextStream<T> {
fn next_str(&mut self) -> Option<&str> {
match self.inner.next_str() {
None => None,
Some(txt) if txt.len() <= self.maxlen => {
Some(txt) // <-- this does not compile
//Some(unsafe {&*(txt as *const str)}) // <-- this fixes the problem
}
_ => self.next_str()
}
}
}

TextStream trait 的工作方式类似于迭代器,只是它产生的 &str 没有重叠的生命周期。 FilterTextStream 的工作方式类似于(专用的)过滤器迭代器。

但是,这段代码编译失败,出现以下错误:

error[E0499]: cannot borrow `*self` as mutable more than once at a time
--> src/main.rs:18:18
|
11 | fn next_str(&mut self) -> Option<&str> {
| - let's call the lifetime of this reference `'1`
12 | match self.inner.next_str() {
| ---------- first mutable borrow occurs here
...
15 | Some(txt)
| --------- returning this value requires that `self.inner` is borrowed for `'1`
...
18 | _ => self.next_str()
| ^^^^ second mutable borrow occurs here

令我吃惊的是,我看不出这是如何借用 self 两次。我们要么在第 15 行返回,要么在第 18 行返回,所以只有两者之一会发生。我的假设是这不是一个真正的问题,但其中一个案例是借用检查器不够聪明。我错过了什么吗?

假设我是对的,我设法使用 unsafe block (请参阅注释掉的第 16 行)通过人为地“破坏”生命周期依赖性来避免此错误。谁能找到更好的方法(即没有任何 unsafe block )来编译此代码?

最佳答案

根据 The Polonius Talk rustc 目前将函数签名中的生命周期视为它们在整个函数体中都是有效的。所以,如果我目前理解正确的话,rustc 认为借用在不同的火柴臂上并不重要。

代码使用 cargo +nightly rustc -- -Zpolonius 进行类型检查,这意味着当 Polonius 功能完全集成时,代码应该进行类型检查而不做任何更改。

我找不到比在相关示例中使用 unsafe 并添加一条说明 unsafe 可以在某个时候删除的注释更好的解决方法。

关于rust - 借用检查器提示多次借用,而只有一次会发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67165025/

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