【问题标题】:Trying to do a mutable borrow of members of a Vec() but rustc thinks I'm trying to mutable borrow the Vec()试图对 Vec() 的成员进行可变借用,但 rustc 认为我正在尝试可变借用 Vec()
【发布时间】:2021-01-01 05:56:30
【问题描述】:

在我正在处理的汇编程序中,标识符可以是两种类型 - 标签或符号。在定义 tokenize_line() 辅助函数时,可以自动将 TokenInfo 枚举的 Identifier 变体的标识符类型参数设置为 Some(IdentifierType::Label) 或 Some(IdentifierType::Symbol)。但是,当使用标识符时,标识符类型并不像定义标识符时那样立即明显。

因此,这需要在主 lex() 函数中完成。但是,为了做到这一点,我需要获取所有标识符标记的可变借用,因为除非标识符类型已经是 Some(whatever),否则我将不得不修改它们。其中一部分是通过我的标记向量向量(标记列表列表)进行线性搜索并获取所有标识符标记的位置,第二部分实际上是对所有这些标识符标记进行可变借用并将它们放入向量中/列表。

但是,通过 for 循环执行此操作会产生一个问题:rust 编译器认为我在重复借用向量/列表,而不是单个标记。我不知道这是否可以解决,或者我是否只需要使用位置列表和令牌列表的实际列表。这是我的代码:

let mut i = 0; // i = Line counter
let mut j = 0; // j = Token counter
let mut positions: Vec<(usize, usize)> = vec!();
for line in &tokens {
    for token in line {
        match &token.info {
            TokenInfo::Identifier(t) => {
                positions.push((i, j));
            }
            _ => {}
        }
        j = j + 1;
    }
    i = i + 1;
}

let mut ident_tokens: Vec<&mut Token> = vec!();

for position in positions {
    ident_tokens.push(&mut tokens[position.0][position.1]);
}

【问题讨论】:

    标签: rust


    【解决方案1】:

    [] 语法返回的引用被认为是派生自对容器的引用,因此不能同时拥有两个这样的引用。因此,而不是

    fn vec_of_ref_mut(vec: &mut Vec<i32>) -> Vec<&mut i32> {
        let mut result = vec![];
        
        for i in 0..vec.len() {
            result.push(&mut vec[i]);
        }
        
        result
    }
    

    你需要使用iter_mut:

    fn vec_of_ref_mut(vec: &mut Vec<i32>) -> Vec<&mut i32> {
        vec.iter_mut().collect()
    }
    

    在像您这样的嵌套案例中,您需要使用flat_map。例如:

    fn vec_of_ref_mut(vec: &mut Vec<Vec<i32>>) -> Vec<&mut i32> {
        vec.iter_mut().flat_map(|sub_vec| sub_vec.iter_mut()).collect()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      相关资源
      最近更新 更多