gpt4 book ai didi

rust - 如何用这个简单的代码满足 Rust 借用检查器的要求?

转载 作者:行者123 更新时间:2023-11-29 07:47:27 25 4
gpt4 key购买 nike

我从借用检查器收到 Rust 编译错误,不知道如何修复。
下面的代码很简单,在C++中类似的代码没有问题。

fn main() {
let mut nums = vec![1, 2, 3];
if let Some(x) = nums.last() {
nums.push(*x);
}
}

这里是错误:

message: 'cannot borrow `nums` as mutable because it is also borrowed as immutable (4, 9)'

最佳答案

当你调用 .last() 时,你借用了 nums 作为不可变的,因为改变它会使你持有的引用 x 无效。然后调用 .push,它借用了 nums 作为可变的。

问题是你现在同时拥有相同值的不可变和可变借用,这违反了 rusts 内存安全保证(多个读者 一个单一的作者保证你会任何地方都不会有无效内存)。

fn main() {
let mut nums = vec![1, 2, 3];
if let Some(x) = nums.last() { // Immutable borrow starts here
nums.push(*x); // Mutable borrow starts here
} // Immutable and mutable borrows end here
}

根据@DanielSanchez 的示例,解决方案是通过立即删除其结果的引用来降低不可变借用的范围:

let mut nums = vec![1, 2, 3];
if let Some(&x) = nums.last() { // Immutable borrow starts and ends here
nums.push(x); // Mutable borrow starts here
} // Mutable borrow ends here

关于rust - 如何用这个简单的代码满足 Rust 借用检查器的要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45344110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com