我正在尝试通过执行
Vec<i32>
来修改 thing[thing.len() - 1] = other_thing;
。我收到一条错误消息,告诉我我首先借用了一个可变引用,然后又借用了一个不可变引用。我找不到解决方法。如何修改 Rust 中向量的最后一个元素。
工作示例:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=a092f6778df0290de7cee1f2321bf175
你不能同时借用同一个变量作为可变和不可变。
当你试图获取向量的长度时,这就是不可变借用发生和恐慌的地方(因为同时你试图改变它的内容,例如可变借用)
您可以通过多种方式做到这一点。 假设您有一个包含 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);