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

9gm1akwq  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(111)

**已关闭。**此问题需要debugging details。它目前不接受回答。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
去年就关门了。
Improve this question
我正在尝试通过执行thing[thing.len() - 1] = other_thing;来修改Vec<i32>。我得到一个错误,告诉我首先借用了一个可变引用,然后借用了一个不可变引用。我找不到解决办法。如何在rust中修改vector的最后一个元素。工作示例:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=a092f6778df0290de7cee1f2321bf175

u4vypkhs

u4vypkhs1#

你不能同时借用可变和不可变的同一个变量。
当你试图得到向量的长度时,这就是不可变借用发生和恐慌的地方(因为同时你试图改变它的内容,例如。可变借用)
你可以用多种方式来做到这一点。假设你有一个有两个切片的向量

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

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

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

但更惯用的方法是使用slice/vec提供的方法并Map返回的Option
要获取最后一项,我们可以使用last_mut(它将返回Option)并在该Option上进行Map,以获取嵌套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);

相关问题