我从借用检查器收到Rust编译错误,并且不知道如何解决它.
下面的代码很简单,C++中的类似代码没有问题.
fn main() {
let mut nums = vec![1, 2, 3];
if let Some(x) = nums.last() {
nums.push(*x);
}
}
Run Code Online (Sandbox Code Playgroud)
这是错误:
message: 'cannot borrow `nums` as mutable because it is also borrowed as immutable (4, 9)'
Run Code Online (Sandbox Code Playgroud)
当你打电话给.last()你借用nums不可变的时候,因为它会改变它会使x你持有的引用无效.然后你打电话.push,借用nums可变的.
问题是你现在有一个不可变的和可变的同时借用相同的值,这是生锈的内存安全保证(多个读者或一个单独的作者保证你永远不会有任何无效的内存).
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
}
Run Code Online (Sandbox Code Playgroud)
根据@ 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
Run Code Online (Sandbox Code Playgroud)
您可以取消引用guard子句中的引用:
fn main() {
let mut nums = vec![1, 2, 3];
if let Some(&x) = nums.last() {
nums.push(x);
}
}
Run Code Online (Sandbox Code Playgroud)
Rust具有强大的模式匹配功能,如果您知道它的类型,您可以解压几乎所有内容.检查Rust模式匹配文档.