我已经学习了 Rust 系统编程以及如何使用
clap
但之前是 2.3 版本,现在版本是 4.5.4。它改变了很多语法和使用方法。
我尝试从参数中获取值,但 source (infile)
和 destination (outfile)
似乎很奇怪。
// This solution works properly but it looks not very nice.
let mut reader: Box<dyn Read> = if matches.get_one::<String>("infile").is_some() {
Box::new(BufReader::new(File::open(matches.get_one::<String>("infile").unwrap())?))
} else {
Box::new(io::stdin())
};
let mut writer: Box<dyn Write> = if matches.get_one::<String>("outfile").is_some() {
Box::new(BufWriter::new(File::create(matches.get_one::<String>("outfile").unwrap())?))
} else {
Box::new(io::stdout())
};
但在此之前我声明了变量,这很恐慌。
// called `Option::unwrap()` on a `None` value
let infile = matches.get_one::<String>("infile").unwrap();
let outfile = matches.get_one::<String>("outfile").unwrap();
我想要这样的最终解决方案:
let infile = matches.....
let outfile = matches.....
let mut reader: Box<dyn Read> = if !infile.is_empty() {
Box::new(BufReader::new(File::open(infile)?))
} else {
Box::new(io::stdin())
};
let mut writer: Box<dyn Write> = if !outfile.is_empty() {
Box::new(BufWriter::new(File::create(outfile)?))
} else {
Box::new(io::stdout())
};
如何声明
infile
和 outfile
变量?
我能找到解决方案。
let infile = match matches.get_one::<String>("infile") {
Some(infile) => infile.to_string(),
_ => String::from(""),
};
let outfile = match matches.get_one::<String>("outfile") {
Some(outfile) => outfile.to_string(),
_ => String::from(""),
};
由于“默认”未实现,所以我无法使用 unwrap_or_default。 使用匹配表达式是解决方案。