Vec<T>
有两种方法:
fn push(&mut self, value: T)
fn split_at_mut(&mut self, mid: usize) -> (&mut [T], &mut [T])
它们都采用对向量的可变引用。但是借用的范围好像不一样,例如:
fn works() {
let mut nums: Vec<i64> = vec![1,2,3,4];
nums.push(5);
println!("{}", nums.len());
}
fn doesnt_work() {
let mut nums: Vec<i64> = vec![1,2,3,4];
let (l,r) = nums.split_at_mut(2);
println!("{}", nums.len());
}
fn also_works() {
let mut nums: Vec<i64> = vec![1,2,3,4];
let _ = nums.split_at_mut(2);
println!("{}", nums.len());
}
doesnt_work
函数不编译,说 nums
上已经有一个可变借用并且它结束并且函数结束。如果我忽略从 split_at_mut
返回的值,问题就会消失.
最佳答案
在 doesnt_work
中对 nums
的借用将持续到变量 l
和 r
存在,因为向量(和向量本身)中的值实际上是借用的,现在只能通过 l
和 r
访问。
您可以通过将 l
和 r
的 let
放在一个结束的范围内来看到这种效果,因此借用也结束。例如,这段代码工作正常,但如果您尝试将 println!
移动到作用域内(大括号内),那么它将失败:
fn works() {
let mut nums = vec![1,2,3,4];
{
let (l, r) = nums.split_at_mut(2);
//println!("{}", nums.len()); //println! will fail here
}
println!("{}", nums.len());
}
在您的 also_works
示例中,您没有对结果做任何事情,因此借用立即丢失。基本上,编译器可以看到您无法通过方法的结果访问向量,因此您可以通过原始向量自由访问它们。
关于rust - 为什么 Vec<T>::split_at_mut 为范围的其余部分借用向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32761370/