gpt4 book ai didi

rust - 借用检查器 : Cannot borrow as immutable because it is also borrowed as mutable

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

我在借用检查器没有“释放”可变借用时遇到问题。

我有:

let mut data = (1..=100).collect::<Vec<_>>();
let mut c = Canvas::new(10, 10, &mut data);


c.iter_rows_mut(4..7);
c.iter_rows(4..7).collect::<Vec<_>>();

它在提示:

error[E0502]: cannot borrow `c` as immutable because it is also borrowed as mutable
--> src/lib.rs:59:9
|
57 | c.iter_rows_mut(4..7);
| - mutable borrow occurs here
58 |
59 | c.iter_rows(4..7).collect::<Vec<_>>();
| ^
| |
| immutable borrow occurs here
| mutable borrow later used here

error: aborting due to previous error

如果我正在处理与可变调用相关的引用,我可以理解这个问题,但事实并非如此。

带有完整代码的 Rust Playground :https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=de4143ddf57cc8a97e7a884bbe13dfa4

最佳答案

这里的问题在于生命周期注解。您一直在使用相同的生命周期 'd,因此 c.iter_rows_mut 中的可变借用必须持续 c 的整个生命周期。

要解决此问题,请在 iter_rowsiter_rows_mut 中使用不同的生命周期。它将被隐式绑定(bind)为不超过 'd,但它会提供更大的灵 active 。

完全明确的签名应该是

fn iter_rows<'a>(&'a self, vertical_range: Range<usize>) -> impl Iterator<Item=(usize, &'a [T])> + 'a

fn iter_rows_mut<'a>(&'a mut self, vertical_range: Range<usize>) -> impl Iterator<Item=(usize, &'a mut [T])> + 'a {

不过,由于生命周期省略,我们不需要任何这些生命周期。输出类型中的所有生命周期将隐式地与 &self(或 &mut self)上的生命周期相同。

fn iter_rows(&self, vertical_range: Range<usize>) -> impl Iterator<Item=(usize, &[T])>
fn iter_rows_mut(&mut self, vertical_range: Range<usize>) -> impl Iterator<Item=(usize, &mut [T])>

(playground)

附言每个函数中的 into_iter 调用都不是必需的:chunks_exact 已经生成了一个迭代器。 Clippy 对此发出警告。

关于rust - 借用检查器 : Cannot borrow as immutable because it is also borrowed as mutable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60782199/

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