我正在尝试最新 beta 版 clap索引页上的“使用派生宏”示例:
// (Full example with detailed comments in examples/01d_quick_example.rs)
//
// This example demonstrates clap's full 'custom derive' style of creating arguments which is the
// simplest method of use, but sacrifices some flexibility.
use clap::{AppSettings, Parser};
/// This doc string acts as a help message when the user runs '--help'
/// as do all doc strings on fields
#[derive(Parser)]
#[clap(version = "1.0", author = "Kevin K. <kbknapp@gmail.com>")]
struct Opts {
/// Sets a custom config …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用而writeln!()
不是println!()
宏写入标准输出,因此我可以优雅地处理 I/O 错误(例如,当我将长时间运行的输出通过管道传输到 时head
)。我在https://rust-cli.github.io/book/tutorial/output.html#a-note-on-printing-performance找到了以下代码片段,包含在错误处理函数中:
use std::io;
fn main() {
if let Err(error) = run() {
eprintln!("{}", error);
}
}
fn run() -> Result<(), io::Error> {
let stdout = io::stdout(); // get the global stdout entity
let mut handle = io::BufWriter::new(stdout); // wrap that handle in a buffer
writeln!(handle, "foo: {}", 42)?; // add ? if you care about errors here
return Ok(());
}
Run Code Online (Sandbox Code Playgroud)
它可以在网站“运行此代码”按钮上运行,但是当我尝试自己构建它时,出现编译器错误:
use std::io;
fn main() {
if let Err(error) …
Run Code Online (Sandbox Code Playgroud) 我有以下 Rust 单元测试:
#[test]
fn test_multiline_strings_are_equal() {
let expected = "\
one
two
three
four
";
let actual = "\
one
two
four
";
assert_eq!(actual, expected);
}
Run Code Online (Sandbox Code Playgroud)
当失败时,会输出以下内容:
---- printer::tests::test_multiline_strings_are_equal stdout ----
thread 'printer::tests::test_multiline_strings_are_equal' panicked at 'assertion failed: `(left == right)`
left: `"one\ntwo\nfour\n"`,
right: `"one\ntwo\nthree\nfour\n"`', src\printer.rs:600:9
Run Code Online (Sandbox Code Playgroud)
谁能告诉我如何让它在不同的行上显示“一”、“二”、“三”和“四”,以便于比较?
我需要查找目录中的所有常规文件,并希望使用 C++20 范围(不是 Eric Niebler 的 range-v3)库。我想出了以下代码:
namespace fs = std::filesystem;
std::vector<fs::directory_entry> entries{ fs::directory_iterator("D:\\Path"), fs::directory_iterator() };
std::vector<fs::path> paths;
std::ranges::copy(entries |
std::views::filter([](const fs::directory_entry& entry) { return entry.is_regular_file(); }) |
std::views::transform([](const fs::directory_entry& entry) { return entry.path(); }),
std::back_inserter(paths));
Run Code Online (Sandbox Code Playgroud)
这可行,但我对使用 lambda 的额外样板感到不舒服;我习惯了 Java 8 流库,我不明白为什么不能直接使用成员函数。这是我第一次尝试重构:
std::ranges::copy(entries |
std::views::filter(fs::directory_entry::is_regular_file) |
std::views::transform(fs::directory_entry::path),
std::back_inserter(paths));
Run Code Online (Sandbox Code Playgroud)
这导致了编译器错误:
error C3867: 'std::filesystem::directory_entry::is_regular_file': non-standard syntax; use '&' to create a pointer to member
error C3889: call to object of class type 'std::ranges::views::_Filter_fn': no matching call operator found
...
Run Code Online (Sandbox Code Playgroud)
所以我尝试了这个:
std::ranges::copy(entries | …
Run Code Online (Sandbox Code Playgroud) 我试图在 Rust 中一次一行地读取一个文件,并按照这个问题中的建议开始:
use std::error::Error;
use std::fs::File;
use std::io::{BufRead, BufReader};
fn main() -> Result<(), Box<dyn Error>> {
let file = File::open("countries.txt")?;
let reader = BufReader::new(file);
for line in reader.lines() {
match line {
Ok(line) => println!("Ok: {}", line),
Err(error) => println!("Err: {}", error),
}
}
return Ok(());
}
Run Code Online (Sandbox Code Playgroud)
但是,我有非 UTF8 文件。Pythonchardet.universaldetector
库告诉我这是 ISO-8859-1:
Cuba
Curaçao
Cyprus
Czech Republic
Côte d'Ivoire
Run Code Online (Sandbox Code Playgroud)
开箱即用,Rust 无法解释具有非 UTF8 字符的行:
$ ./target/release/main1
Ok: Cuba
Err: stream did not contain valid UTF-8
Ok: Cyprus …
Run Code Online (Sandbox Code Playgroud)