gpt4 book ai didi

rust - 使用 - 作为标准输入/标准输出

转载 作者:行者123 更新时间:2023-12-05 05:49:53 25 4
gpt4 key购买 nike

许多命令行工具让您使用 -用于标准输入或标准输出。在 Rust 中是否有一种惯用的方法来支持它?

看起来处理命令行参数最常见的方式是 clap .如果我只想处理路径而不想处理特殊情况 - , 我可以用

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(())
}

但是,要处理 - 的情况作为标准输出,它更复杂。 file 的类型现在需要 Box<dyn Write>stdout()不是 File , 正确设置它有点复杂。不难,就是那种需要复制多次,容易搞砸的样板。

有没有一种惯用的方法来处理这个问题?

最佳答案

这是您必须写入代码中的内容。在许多情况下,不清楚 - 是否应该代表标准输入或标准输出,并且它需要程序的上下文才能正确解释它。

您实际上需要使用 Box<dyn Write> (或 &dyn Write 或类似的)在这种情况下。如果你使用的是 Unix,你可以创建一个 File通过使用 FromRawFd 创建一个来自标准输入或输出的对象(和类似但不相同的东西,在 Windows 上),但你应该避免这样做,因为当你放下一个 File , 文件描述符被关闭,这不是这里的正确行为。

事实上,不小心关闭了一个标准文件描述符实际上会导致数据损坏,因为如果打开另一个文件,它将以可能的最低值(例如,1,标准输出)打开,然后事情喜欢println!可能会不小心打印到新打开的文件。

所以使用 dyn Write在这里是正确的选择。在大多数情况下,性能影响不会很明显。

关于rust - 使用 - 作为标准输入/标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70600456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com