Loops E0597尝试在向量上循环
我通过做一些编程练习来自学。这里我有一个从文件中读取的Vec,我试着把每行中的字母放到哈希集中,然后取所有行的交点 当我这样做的时候,我会得到一个错误,说我的循环变量活得不够长 我有一种直觉——我有一个变量l,它的寿命是循环的一次迭代,另一个变量候选,它的寿命是整个循环,第二个变量借用了第一个变量。但是我该怎么解决这个问题呢Loops E0597尝试在向量上循环,loops,rust,set,lifetime,borrow-checker,Loops,Rust,Set,Lifetime,Borrow Checker,我通过做一些编程练习来自学。这里我有一个从文件中读取的Vec,我试着把每行中的字母放到哈希集中,然后取所有行的交点 当我这样做的时候,我会得到一个错误,说我的循环变量活得不够长 我有一种直觉——我有一个变量l,它的寿命是循环的一次迭代,另一个变量候选,它的寿命是整个循环,第二个变量借用了第一个变量。但是我该怎么解决这个问题呢 let mut candidates = HashSet::<&u8>::new(); let mut sum = 0; for l in lines
let mut candidates = HashSet::<&u8>::new();
let mut sum = 0;
for l in lines { // lines is Vec<String>
if candidates.len()==0 {
candidates = HashSet::<&u8>::from_iter(l.as_bytes());
println!("candidates = {:?}", candidates);
} else if l.len() == 0 { // error message "borrow later used here"
// end of group
sum = sum + candidates.len();
candidates = HashSet::<&u8>::new();
} else {
let h2 = HashSet::<&u8>::from_iter(l.as_bytes()); // error message "borrowed value does not live long enough"
candidates = candidates.intersection(&h2).copied().collect();
println!("candidates = {:?}", candidates);
}
println!("{}", l);
}
但是我得到一个不同的错误,错误[E0506]:无法分配给l2,因为它是借用的。因为\u bytes将l字符串转换为字节片。切片是对连续元素序列的引用。编译器指出,在for循环结束时,引用无效
一种解决方案是使用以下行对字符串引用进行iter:
让mut候选者=HashSet:::新建;
设mut和=0;
for l in&lines{/as_bytes将l字符串转换为字节片。片是对连续元素序列的引用。编译器指出,在for循环结束时,该引用无效
一种解决方案是使用以下行对字符串引用进行iter:
让mut候选者=HashSet:::新建;
设mut和=0;
对于l in&lines,{/候选项可以包含上一次循环迭代中对l的引用,但在每次循环迭代结束时都会删除l,因此会出现编译错误。您可以通过使用into_字节而不是as_字节来避免所有这些问题,这样您就可以获得拥有的值而不是引用。下面是一个经过清理的重构版本:
使用std::collections::HashSet;
fn示例行:Vec{
让mut候选者:HashSet=HashSet::new;
设mut和=0;
排队{
dbg!&line;
让h2:HashSet=line.into_bytes.into_iter.collect;
如果a.u为空{
候选者=h2;
}否则,如果h2.u为空{
sum+=candidates.len;
候选者=HashSet::new;
}否则{
候选者=候选者。交叉点&h2.copied.collect;
}
dbg!&候选人;
}
}
候选对象可以将上一次循环迭代中的引用包含到l中,但l会在每次循环迭代结束时被删除,因此会出现编译错误。您可以通过使用into_字节而不是as_字节来避免所有这些问题,这样您就可以获得拥有的值而不是引用。下面是一个经过清理的重构版本:
使用std::collections::HashSet;
fn示例行:Vec{
让mut候选者:HashSet=HashSet::new;
设mut和=0;
排队{
dbg!&line;
让h2:HashSet=line.into_bytes.into_iter.collect;
如果a.u为空{
候选者=h2;
}否则,如果h2.u为空{
sum+=candidates.len;
候选者=HashSet::new;
}否则{
候选者=候选者。交叉点&h2.copied.collect;
}
dbg!&候选人;
}
}
对于l in&lines{,您可以像in一样借用吗?对于l in&lines{,您可以像in一样借用吗?此解决方案的另一个优点是u8比&u8小且快。此解决方案的另一个优点是u8比&u8小且快。
let mut l2:String = "".to_string();
for l in lines {
if candidates.len()==0 {
l2 = l.to_string();
candidates = HashSet::<&u8>::from_iter(l2.as_bytes());