Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops E0597尝试在向量上循环_Loops_Rust_Set_Lifetime_Borrow Checker - Fatal编程技术网

Loops E0597尝试在向量上循环

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

我通过做一些编程练习来自学。这里我有一个从文件中读取的Vec,我试着把每行中的字母放到哈希集中,然后取所有行的交点

当我这样做的时候,我会得到一个错误,说我的循环变量活得不够长

我有一种直觉——我有一个变量l,它的寿命是循环的一次迭代,另一个变量候选,它的寿命是整个循环,第二个变量借用了第一个变量。但是我该怎么解决这个问题呢

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());