我有这样的掌声App
:
let m = App::new("test")
.arg(
Arg::with_name("INPUT")
.help("a string to be frobbed")
.multiple(true),
)
.get_matches();
如果有的话,我想将参数作为字符串的可迭代读取,myapp str1 str2 str3
但如果没有,则充当过滤器并从 stdin 读取可迭代的行cat afile | myapp
。这是我的尝试:
let stdin = io::stdin();
let strings: Box<Iterator<Item = String>> = if m.is_present("INPUT") {
Box::new(m.values_of("INPUT").unwrap().map(|ln| ln.to_string()))
} else {
Box::new(stdin.lock().lines().map(|ln| ln.unwrap()))
};
for string in strings {
frob(string)
}
我相信,因为我只需要Iterator
特征,所以 aBox<Iterator<Item = String>>
是唯一的方法。那是对的吗?