如何将变量的资源推入向量但使其保持活动状态
how to push into a vector a variable's resource but keep it alive
我有一个问题,关于如何将一个变量 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
in
v.push(letterset.clone());
letterset.clear();
因为 letterset
无论如何都会被清除。相反,我想将其内容移动到 v
但保持它的活动状态,因为 letterset
必须用于下一次迭代。
我试图删除 .clone()
但显然这会导致 'borrow after move' 错误。不知道怎么办,谢谢。
为什么不在每次迭代时都创建一个新的 LetterSet?移动 Vec 只是移动对堆的引用,它非常便宜。
如果你真的想重复使用相同的变量,你可以使用 std::mem::take
这将 return 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 }]);
}
我有一个问题,关于如何将一个变量 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
in
v.push(letterset.clone());
letterset.clear();
因为 letterset
无论如何都会被清除。相反,我想将其内容移动到 v
但保持它的活动状态,因为 letterset
必须用于下一次迭代。
我试图删除 .clone()
但显然这会导致 'borrow after move' 错误。不知道怎么办,谢谢。
为什么不在每次迭代时都创建一个新的 LetterSet?移动 Vec 只是移动对堆的引用,它非常便宜。
如果你真的想重复使用相同的变量,你可以使用 std::mem::take
这将 return 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 }]);
}