【发布时间】:2020-03-27 11:07:59
【问题描述】:
这种情况下的错误是什么意思:
fn main() {
let mut v: Vec<usize> = vec![1, 2, 3, 4, 5];
v[v[1]] = 999;
}
error[E0502]: cannot borrow `v` as immutable because it is also borrowed as mutable
--> src/main.rs:3:7
|
3 | v[v[1]] = 999;
| --^----
| | |
| | immutable borrow occurs here
| mutable borrow occurs here
| mutable borrow later used here
我发现索引是通过Index 和IndexMut 特征实现的,v[1] 是*v.index(1) 的语法糖。有了这些知识,我尝试运行以下代码:
use std::ops::{Index, IndexMut};
fn main() {
let mut v: Vec<usize> = vec![1, 2, 3, 4, 5];
*v.index_mut(*v.index(1)) = 999;
}
令我惊讶的是,这完美无缺!为什么第一个 sn-p 不起作用,但第二个起作用?我理解文档的方式,它们应该是等价的,但显然不是这样。
【问题讨论】:
-
随着代码的出现学习 Rust?欢迎来到 StackOverflow,感谢您提出的好问题!
-
准确地说; ) 这是我做这件事的第三年(在那之前是 2x Haskell)~> 因为我开始对低级的东西更感兴趣,所以我想给 Rust 一个旋转
-
@LucasBoucke 这很有趣,我通常在我的项目中使用 Rust,但我在 Haskell 中编写了这个 AoC。它们都是各自领域的优秀语言。
标签: rust borrow-checker