gpt4 book ai didi

rust - 为什么 Vec::split_at_mut 为范围的其余部分借用向量?

转载 作者:行者123 更新时间:2023-11-29 08:02:37 24 4
gpt4 key购买 nike

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 的借用将持续到变量 lr 存在,因为向量(和向量本身)中的值实际上是借用的,现在只能通过 lr 访问。

您可以通过将 lrlet 放在一个结束的范围内来看到这种效果,因此借用也结束。例如,这段代码工作正常,但如果您尝试将 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/

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