当我尝试修改向量的最后一个元素时出现借用错误[关闭]

问题描述 投票:0回答:1

我正在尝试通过执行

Vec<i32>
来修改
thing[thing.len() - 1] = other_thing;
。我收到一条错误消息,告诉我我首先借用了一个可变引用,然后又借用了一个不可变引用。我找不到解决方法。如何修改 Rust 中向量的最后一个元素。 工作示例:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=a092f6778df0290de7cee1f2321bf175

rust vector lifetime
1个回答
0
投票

你不能同时借用同一个变量作为可变和不可变。

当你试图获取向量的长度时,这就是不可变借用发生和恐慌的地方(因为同时你试图改变它的内容,例如可变借用)

您可以通过多种方式做到这一点。 假设您有一个包含 2 个切片的向量

let mut thing = vec![[1, 2], [3, 4]];

首先,手动计算并从向量中获取最后一项(就像您在版本中所做的那样)

let len = thing.len(); // immutable borrow use
thing[len - 1][1] = 20; // mutable borrow use

但更惯用的方法是使用

slice/vec
提供的方法并映射返回的
Option

要获取最后一项,我们可以使用 last_mut (将返回

Option
)并映射到
Option
来获取嵌套
slice
的最后一项,并将其值更改为
20

// Set vector's last slice's value at index 1 to 20
thing.last_mut().map(|s| s[1] = 20);
// Set vector's last slice's last value to 20
// In our case this is the same as previous one
thing.last_mut().map(|s| s.last_mut().map(|i| *i = 20));

assert_eq!(vec![[1, 2], [3, 20]], thing);
© www.soinside.com 2019 - 2024. All rights reserved.