Rust 借用检查器:不能作为不可变借用,因为它也是作为可变借用的

Rust 借用检查器:不能作为不可变借用,因为它也是作为可变借用的,rust,Rust,借用检查器未发布可变借用时出现问题 我有: 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 immu

借用检查器未发布可变借用时出现问题

我有:

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
如果我正在处理与可变调用相关的引用,我可以理解这个问题,但情况似乎并非如此


请使用完整的代码:

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

要解决此问题,请在iter_行和iter_行中使用不同的生存期。它将被隐式绑定为不超过'd',但它将允许更大的灵活性

完全明确的签名应该是

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

另外,每个函数中的into_iter调用都不是必需的:chunks_exact已经生成了一个迭代器。克里皮对此提出了警告。

回答得非常好,非常彻底。非常感谢。
fn iter_rows_mut<'a>(&'a mut self, vertical_range: Range<usize>) -> impl Iterator<Item=(usize, &'a mut [T])> + 'a {
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])>