2015-11-26 2 views
0

Моя программа должна прочитать некоторые параметры из командной строки. Если кто-то не предоставляет необязательный параметр пароля, программа должна запросить его. Поэтому соответствующее поле моделируется как тип 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); 
} 

Запуск программы preinitialized с Some("Some arg") выводит строку «пароль Некоторые аргумент» в консоли, как и ожидалось, но переключение на None ничего не делает, даже не завершение программы.

Не могли бы вы заметить мою ошибку или дать мне совет? Я использую rustc verison rustc 1.4.0 (8ab8581f6 2015-10-27). Заранее спасибо.

ответ

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() функция читает до конца файла. Ваша программа действительно читает ввод, но вам нужно отправить ей символ EOF (Ctrl-D на Linux), чтобы он продолжал выполнение.

+0

Спасибо, это была одна проблема. Другой заключается в том, что я должен очистить выходной поток, чтобы получить подсказку на консоли. Поэтому после печати нужно добавить '' io :: stdout :: flush() ''. – 0x0me

Смежные вопросы