我的程序应该从命令行读取一些参数。如果有人不提供可选的密码参数,程序应该要求它。因此,相应的字段被建模为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)
。提前谢谢。
答案 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
)才能继续执行。