Rust 用子切片引用覆盖切片引用时出错

Rust 用子切片引用覆盖切片引用时出错,rust,Rust,我正在努力确定所有权规则。我想: 从对切片的可变引用开始 对其内容进行一些编辑 将切片引用减少为子切片的引用并重复 以下是我的尝试: pub fn example() { // Make a mutable slice let mut v = [0, 1, 2, 3]; // Make a mutable reference to said slice let mut v_ref = &mut v[..]; while v_ref.len()

我正在努力确定所有权规则。我想:

从对切片的可变引用开始 对其内容进行一些编辑 将切片引用减少为子切片的引用并重复 以下是我的尝试:

pub fn example() {
    // Make a mutable slice
    let mut v = [0, 1, 2, 3];

    // Make a mutable reference to said slice
    let mut v_ref = &mut v[..];

    while v_ref.len() > 1 {
        // Involves some edits -> need mut
        v_ref.swap(0, v_ref.len() - 1);

        // Try to reduce slice to sub-slice (some simplification here)
        // Errors!
        let (v_l, v_h) = v.split_at_mut(v.len() / 2);
        v_ref = v_l;
    }
}
但是我得到了错误:

错误[E0502]:无法将“*v_ref”作为不可变项借用,因为它也是作为可变项借用的 ->src/lib.rs:11:23 | 11 | v|u ref.swap0,v|u ref.len-1; |--^^^^^-可变借用到此结束 | | | ||此处发生不可变借用 |可变借用发生在这里 错误[E0499]:一次不能将'v'作为可变项借用多次 ->src/lib.rs:15:26 | 7 |让mut v_ref=&mut v[…]; |-第一个可变借用发生在此处 ... 15 |设v_l,v_h=v.split_at_mutv.len/2; |^第二个可变借用发生在此处 ... 18 | } |-第一次借钱到此为止 错误[E0502]:无法将'v'作为不可变项借用,因为它也是作为可变项借用的 ->src/lib.rs:15:41 | 7 |让mut v_ref=&mut v[…]; |-此处发生可变借用 ... 15 |设v_l,v_h=v.split_at_mutv.len/2; |^此处发生不可变借用 ... 18 | } |-可变借用结束于此 我理解,不能在同一范围内对一个对象进行多个引用,而只能使用一个可变引用

应该有一种安全的方法来缩小切片的范围,因为您只是在缩小当前可变引用的范围。最好的方法是什么?

问题1:可变和不变地使用同一个变量 例如,代码尝试引用变量v,同时存在对它的并发可变引用,即使您不再关心v_ref。MCVE:

pub fn example() {
    let mut v = 0;
    let mut v_ref = &mut v;
    println!("{}", v)
}
另见:

问题2:可变和不可变地使用同一变量 然后,代码尝试在单个函数调用中重叠可变和可变借用。MCVE:

pub fn example() {
    let mut v = [0, 1, 2, 3];
    v.split_at_mut(v.len());
}
另见:

问题3:可变和可变地使用同一变量 然后代码在循环中有v的重叠可变借用

另见:

总而言之:

pub fn example() {
    let mut v = [0, 1, 2, 3];
    let mut v_ref = &mut v[..];

    while v_ref.len() > 1 {
        let len = v_ref.len();
        v_ref.swap(0, len - 1);
        let (v_l, _) = { v_ref }.split_at_mut(len / 2);
        v_ref = v_l;
    }
}

一旦您可变地借用了v,即让mut v_ref=&mut v[…];,在借贷结束之前,你不能再访问v。那是因为你会借它两次,这是不允许的,当其中一个借款是可变的。然而,v_ref现在指向相同的数据,你可以借用v_ref。为什么它一直抱怨我使用v.len?-len方法将借用v,这是不允许的,因为v_ref已经可变地借用了v。相反,只需使用v_ref.len,它指向相同的数据。我理解,对一个对象的多个引用不能与单个可变引用在同一范围内-为什么要尝试对同一对象使用多个引用,然后使用v/v_ref?请不要编辑您的问题,使现有答案无效。在发布问题和提供答案之前,欢迎您根据自己的心意编辑问题。这不会使问题无效-打字错误并不是我问题的核心。这肯定解决了我给您的简化问题。。。但它并没有解决我的实际问题:谢谢anyway@CrepeGoat好吧,现在你可以找出这个和那个的区别,然后问一个新问题。如果你想帮助减少它,请随意进入。