如何将变量的值推送到向量中,但保持变量的活动?



我遇到了一个问题,关于如何将变量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();

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

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

为什么不在每次迭代时创建一个新的LetterSet?移动Vec只是将引用移动到堆中,这相当便宜。

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

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

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

您可以简单地将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 }]);
}

最新更新