小编Huw*_*ers的帖子

带有派生宏的 Clap 选项无法在 rust clap 3.0.0-beta.5 中编译

我正在尝试最新 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)

rust clap

24
推荐指数
1
解决办法
9253
查看次数

Rust 教程代码中出现“错误[E0599]:未找到名为 write_fmt 的方法”错误

我正在尝试使用而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)

macros command-line-interface traits rust rust-macros

7
推荐指数
1
解决办法
6351
查看次数

我怎样才能让assert_eq! 在 Rust 中显示多行字符串

我有以下 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)

谁能告诉我如何让它在不同的行上显示“一”、“二”、“三”和“四”,以便于比较?

rust

4
推荐指数
1
解决办法
681
查看次数

如何使用成员函数进行标准库范围操作

我需要查找目录中的所有常规文件,并希望使用 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)

c++ c++20 std-ranges

3
推荐指数
1
解决办法
613
查看次数

如何在 Rust 中逐行读取非 UTF8 文件

我试图在 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)

utf-8 rust

1
推荐指数
1
解决办法
536
查看次数