下面的code会触发描述良好的cannot borrow as immutable because it is also borrowed as mutable错误:

    let mut buf = [0; 128];
    let p = &mut buf[0..buf.len()];
error[E0502]: cannot borrow `buf` as immutable because it is also borrowed as mutable
 --> src/main.rs:3:25
  |
3 |     let p = &mut buf[0..buf.len()];
  |                  -------^^^-------
  |                  |  |   |
  |                  |  |   immutable borrow occurs here
  |                  |  mutable borrow later used here
  |                  mutable borrow occurs here

我理解产生这个错误的机制,但是编译器不是以错误的方式看待这个问题吗?

在获取数组的可变borrow 之前,必须解析该范围.因此,在可变借入可以发生之前,它必须已经获得了不可变的借入、运行len()、检索了长度并释放了不变借入来创建范围.

在知道范围之前获取可变借入是没有意义的.

这是实现对生命周期的限制(例如,类似于non-lexical lifetimes最终解决的问题),还是故意这样做?

推荐答案

为了补充另一个答案,考虑对数组进行切片实际上不是一个内置操作,而是调用IndexMut::index_mut(在本例中是Index::index,如果切片是不变的话是Index::index).go 糖化,这一行相当于:

let p = &mut *IndexMut::index_mut(&mut buf, 0..buf.len());

这使得代码被拒绝的原因变得更加清楚.参数总是按从左到右的顺序进行计算,因此首先计算&mut buf,在计算buf.len()之前独占borrow buf.

但是,在索引时,无界范围..将被限制到切片的边界,因此您可以简单地写下:

let p = &mut buf[..];

这是迄今为止修复错误的最简单方法.

Rust相关问答推荐

通用池类型xsx

如何从接收&;self的方法克隆RC

如何在Rust中实现Functor trait?

铁 rust 干线无法使用PowerShell获取环境变量

带扫描的铁 rust 使用滤镜

在Rust中是否可以使用Rc自动化约束传播

如何在Rust中缩短数组

考虑到Rust不允许多个可变引用,类似PyTorch的自动区分如何在Rust中工作?

如何获取光标下的像素 colored颜色 ?

在使用粗粒度锁访问的数据 struct 中使用 RefCell 是否安全?

如何迭代存储在 struct 中的字符串向量而不移动它们?

从字节数组转换为字节元组和字节数组时,为什么 Transmute 会对字节重新排序?

Option<&T> 如何实现复制

当锁被释放时,将锁包装到作用域中是否会发生变化?

Rust 异步循环函数阻塞了其他future 任务的执行

切片不能被 `usize` 索引?

如何将 Rust 中的树状 struct 展平为 Vec<&mut ...>?

在 Rust 中,为什么整数溢出有时会导致编译错误或运行时错误?

为什么指定生命周期让我返回一个引用?

`if let` 只是另一种编写其他 `if` 语句的方式吗?