许多命令行工具允许您使用-作为标准输入或标准输出。有什么惯用的方法来支持这一点吗?
看起来,处理命令行参数的最常用方法是clap。如果我只想处理路径,而donʼ不想使用特例ʼ,我可以使用
use std::fs::File;
use std::io::Write;
use std::path::PathBuf;
use clap::Parser;
#[derive(clap::Parser, Debug)]
struct Args {
#[clap(parse(from_os_str))]
output: PathBuf,
}
fn main() -> std::io::Result<()> {
let args = Args::parse();
let mut file = File::create(args.output)?;
file.write_all(b"Hello, world!")?;
Ok(())
} 但是,要处理-是stdout的情况,ʼ要复杂得多。file的类型现在需要是Box<dyn Write>,因为stdout()不是File,正确设置stdout()有点复杂。这并不难,但这种样板需要多次复制,而且很容易搞砸。
有什么惯用的方法来处理这件事吗?
发布于 2022-01-05 22:59:00
这是您只需在代码中写入的内容。在许多情况下,不清楚-应该表示标准输入还是标准输出,它需要程序的上下文才能正确地解释它。
实际上,在这种情况下,您需要使用Box<dyn Write> (或&dyn Write或类似的)。如果使用Unix,可以通过使用File (以及类似但不完全相同的FromRawFd )创建一个标准输入或输出来创建一个File对象,但是您应该避免这样做,因为当您删除File时,文件描述符是关闭的,这不是正确的行为。
事实上,不小心关闭一个标准文件描述符实际上会导致数据损坏,因为如果打开另一个文件,它将以尽可能低的值打开(例如,1,用于标准输出),然后像println!这样的东西可能会意外地打印到新打开的文件中。
所以在这里使用dyn Write是正确的选择。在大多数情况下,性能影响并不明显。
https://stackoverflow.com/questions/70600456
复制相似问题