0

我有一个关于如何将move变量转换为向量但不破坏该变量的问题,因为它必须在循环中重用。下面显示了我的意思:

type Letter = char;
type LetterSet = Vec<Letter>;

fn main() {
    let mut v = Vec::<LetterSet>::new();
    let mut letterset: LetterSet = LetterSet::new(); 

    for i in 0..5 {
        let a = (48 + i as u8) as char;
        letterset.push(a);
        if i % 2 == 1 {
            let b = (65 + i as u8) as char;
            letterset.push(b); 
        } else {
            let c = (97 + i as u8) as char;
            letterset.push(c);
        }
        v.push(letterset.clone());
        letterset.clear();
    }

    for letterset in v {
        for letter in letterset {
            print!("{} ", letter);
        }
        println!("");
    } 
}

上面的代码运行。clone但是,我想避免

        v.push(letterset.clone());
        letterset.clear();

因为letterset无论如何都会被清除。相反,我想将其内容移入v 但保持其活动状态,因为letterset必须用于下一次迭代。

我试图删除.clone(),但显然这会导致“移动后借用”错误。我想知道怎么做,谢谢。

4

2 回答 2

1

为什么不在每次迭代时创建一个新的 LetterSet?移动 Vec 只是移动对堆的引用,它非常便宜。

如果您真的想重新使用相同的 var,您可以使用std::mem::take它将返回 Vec 并默认替换原始变量(一个空的 vec) - 这具有相同的行为,因为您每次都在创建一个新的 Vec。

v.push(std::mem::take(&mut letterset));

您也可以跳过.clear(),因为它已经是空的。

于 2021-07-11T21:20:54.090 回答
1

您可以简单地将letterset初始化移动到内部循环中:

for i in 0..5 {
    let mut letterset: LetterSet = LetterSet::new(); 
    let a = (48 + i as u8) as char;
    letterset.push(a);
    if i % 2 == 1 {
        let b = (65 + i as u8) as char;
        letterset.push(b); 
    } else {
        let c = (97 + i as u8) as char;
        letterset.push(c);
    }
    v.push(letterset);
}

或者完全消除它:

for i in 0..5 {
    let a = (48 + i as u8) as char;
    let b = (65 + i as u8) as char;
    let c = (97 + i as u8) as char;
    v.push(vec![a, if i % 2 == 1 { b } else { c }]);
}
于 2021-07-11T21:22:12.967 回答