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])>