可变借入循环

Mutable borrow inside loop

提问人:Marko Seidenglanz 提问时间:7/5/2021 最后编辑:Daniel A. WhiteMarko Seidenglanz 更新时间:4/17/2022 访问量:228

问:

我有一个元组向量,每个元组包含两个字符串。我想将两个字符串(其中一个)作为可变引用传输到哈希图中。另一个字符串也会传输,但不必是可变的。背景是我想稍后用另一个字符串的值覆盖一个字符串。

给定以下代码:

use std::collections::HashMap;

fn main() {
    let mut foo = String::from("foo");
    let mut bar = String::from("bar");
    let mut v = vec![(foo, &mut bar)];
    let mut counter: HashMap<&str, (&str, &mut String, u8)> = HashMap::new();
    
    create_counter(&mut v, &mut counter);
}

fn create_counter<'a>(
    rows: &'a mut Vec<(String, &'a mut String)>,
    counter: &mut HashMap<&'a str, (&'a str, &'a mut String, u8)>,
) {
    let mut skip_count = 0;
    let len = rows.len();
    for i in 0..len {
        if i == len - 1 {
            break;
        }
        if skip_count > 0 {
            skip_count -= 1;
            continue;
        }

        let r = rows[i..i + 3].as_mut();

        if r[0].0 == r[1].0 && r[0].1 != r[1].1 {
            if r.len() == 2 || r[0].0 != r[2].0 {
                counter.entry(&r[0].0).or_insert((r[1].1, &mut r[0].1, 0)).2 += 1;
                skip_count = 1;
            } else {
                skip_count = 2;
            }
        }
    }
}

不幸的是,借用检查器不允许这样做,并给了我两个错误消息:

cannot borrow `*rows` as mutable more than once at a time
cannot borrow `r[_].1` as mutable because it is also borrowed as immutable

我理解这个问题,但不幸的是,我不知道如何最好地解决它。

有人可以帮我解决这两个问题吗?

Playground 链接

参考 可变 借用检查器

评论

0赞 Netwave 7/5/2021
好吧,你不能对同一个项目有 2 个可变引用。因此,您需要将物品包装在一些物品中。Rc<RefCell>
1赞 Hadus 7/5/2021
这肯定不是你的做法。你必须重新思考算法。我可以在聊天室里帮你:chat.stackoverflow.com/rooms/234519/mutable-borrow-inside-loop
0赞 Marko Seidenglanz 7/5/2021
实际上,我不想创建对同一项的多个可变引用,而是对元组中的不同项创建多个可变引用。
0赞 isaactfa 7/6/2021
也许我误读了您的代码,但看起来它最终会对 in 和 in 具有可变引用。r[0].1rowscounter

答: 暂无答案