如果是 Some(_),如何解开 Option<_>,否则使用后备表达式?

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

我已经学习了 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
变量?

rust pattern-matching option-type
1个回答
0
投票

我能找到解决方案。

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。 使用匹配表达式是解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.