调用println!循环外是一个无法访问的语句,如何以“可达”的方式使用println

问题描述 投票:-1回答:1

如何在循环终止后打印频率HashSet?问题似乎是无法保证循环终止。

use std::collections::HashSet;
use std::fs;

fn main() {
    let f = fs::read_to_string("input.txt").expect("Unable to open file");

    let mut total = 0;
    let mut frequencies = HashSet::new();
    frequencies.insert(0);

    loop {
        for line in f.lines() {
            let line_trimmed = line.trim();
            let something = line_trimmed.parse::<i32>().unwrap();
            total += something;
            // println!("{:?}",total);

            if frequencies.contains(&total) {
                println!("duplicated found {:?}", total);
                return;
            }
            frequencies.insert(total);
        }
    }
    println!("duplicated found {:?}", frequencies);
}
rust
1个回答
3
投票

println!("duplicated found {:?}", frequencies);是无法到达的,因为当你打电话给return时,你正在退出main功能。

将循环更改为while,并设置变量以退出while循环。

let mut duplicated_found = false;
while !duplicated_found {
    for line in f.lines() {

        let line_trimmed = line.trim();
        let something = line_trimmed.parse::<i32>().unwrap();
        total += something;
        // println!("{:?}",total);

        if frequencies.contains(&total) {
            println!("duplicated found {:?}", total);
            duplicated_found = true;
            break; // This breaks out of the for loop
        }
        frequencies.insert(total);
    }
}
println!("duplicated found {:?}", frequencies);

或者您可以使用标签指定要突破的循环:

'outer: loop {
    for line in f.lines() {

        let line_trimmed = line.trim();
        let something = line_trimmed.parse::<i32>().unwrap();
        total += something;
        // println!("{:?}",total);

        if frequencies.contains(&total) {
            println!("duplicated found {:?}", total);
            break 'outer; // This breaks out of the outer loop
        }
        frequencies.insert(total);
    }
}
println!("duplicated found {:?}", frequencies);
© www.soinside.com 2019 - 2024. All rights reserved.