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

标签 rust borrow-checker

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/

相关文章:

rust - 你如何在 rust 中为 'everything else' 设置默认的#[cfg] 目标?

data-structures - 如何从 cons 列表中弹出一个值?

rust - 不能作为不可变借用,因为它也作为可变借用

rust - 带有HashMap的“temporary value dropped while borrowed” <&str,&dyn Fn(&str)-> bool>

rust - 什么时候应该在 Rust 中使用内联?

input - 如何从字符串中提取两个整数?

rust - 如何正确导入 serde_with::nested::json 依赖项

rust - 循环中的可变借用

stream - 在多个闭包中表达变量对的生命周期

rust - 为什么每种情况下读取的字节数不同?