读取模式匹配分支

时间:2015-11-26 18:26:44

标签: input console pattern-matching rust

我的程序应该从命令行读取一些参数。如果有人不提供可选的密码参数,程序应该要求它。因此,相应的字段被建模为Option类型。

如果参数是从命令行提供的(具有值Some("...")的选项,但匹配None情况的分支不要求输入。

简化程序看起来像

fn main() {
    use std::io::{self,Read};

    let arg : Option<String> = None; // Does not terminate
    //let arg : Option<String> = Some("Some arg".to_string()); // works well printing 'Some arg'
    println!("Checking for password");


    let password = match arg {
        Some(val) => val.to_string(),
        None => {
            print!("Password:");
         let mut buffer = String::new();
         io::stdin().read_to_string(&mut buffer).unwrap();
         buffer
        }
    };

    println!("password is {}", password);
}

运行使用Some("Some arg")预初始化的程序打印字符串&#34;密码是一些arg&#34;如预期的那样到控制台,但切换到None什么都不做,甚至没有终止程序。

你能发现我的错误或给我一些建议吗?我正在使用rustc verison rustc 1.4.0 (8ab8581f6 2015-10-27)。提前谢谢。

1 个答案:

答案 0 :(得分:2)

您需要使用read_line()

fn main() {
    use std::io::{self,Read};

    let arg : Option<String> = None; // Does not terminate
    //let arg : Option<String> = Some("Some arg".to_string()); // works well printing 'Some arg'
    println!("Checking for password");

    let password = match arg {
        Some(val) => val.to_string(),
        None => {
            print!("Password:");
            let mut buffer = String::new();
            io::stdin().read_line(&mut buffer).unwrap();
            buffer
        }
    };

    println!("password is {}", password);
}

read_to_string()函数读取直到文件结束。 您的程序确实读取了输入,但您需要在Linux上发送EOF字符(Ctrl-D)才能继续执行。