小编Jim*_*Jim的帖子

使用“clap”在 Rust CLI 工具中设置布尔标志

我正在尝试使用一个 CLI 工具来根据某些指定的正则表达式编辑文件夹中的文件。

在调试时,举个例子:

cargo run -- folder ./tests/test_files -t emails ip -r
Run Code Online (Sandbox Code Playgroud)

这意味着编辑文件夹 path = 中的所有文件,./tests/test_files并且-r意味着递归地执行此操作。

下面是尝试实现此目的的结构列表:

use clap::{Parser, Subcommand, Args};

#[derive(Debug, Parser)]
#[clap(author, version, about, name = "raf")]
pub struct Opts {
    #[clap(subcommand)]
    pub cmd: FileOrFolder,
}

#[derive(Debug, Subcommand)]
pub enum FileOrFolder {
    #[clap(name = "folder")]
    Folder(FolderOpts),
    #[clap(name = "file")]
    File(FileOpts),
}

#[derive(Args, Debug)]
pub struct FolderOpts {
    /// `path` of the directory in which all files should be redacted, e.g. ./tests/test_files
    #[clap(parse(from_os_str), required …
Run Code Online (Sandbox Code Playgroud)

command-line-interface rust clap

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

为什么 Rust 的人造丝使用 Arc<Mutex<anyhow::Result<()>>> 需要更长的时间?

我正在尝试使用 crate 并行化我的代码rayon。该过程是读取一个文件,对其进行处理并输出处理后的文件。

我想记下每个文件的处理结果,以便我有一个Arc<Mutex<Vec<anyhow::Result<()>>>>锁定并推送anyhow::Result<()>一个文件处理结果的每个结果。

fn main() {
    let (mut files, _) = utils::get_files_from_folder(input_folder)?;

    let results = Arc::new(Mutex::new(Vec::<anyhow::Result<()>>::new()));

    files.par_iter_mut().for_each(|path| {
        
        if let Some(extension) = path.extension() {
            if extension == "txt" {
                let result = redact::redact_txt_and_write_json(path, &regex_vec, &output_folder); // processing done here
                results.lock().expect("`results` cannot be locked").push(result); // lock the mutex and push done here
            } else {
                eprintln!(
                    "{}INVALID EXTENSION: {} - Not yet implemented",
                    *RED_ERROR_STRING,
                    extension.to_string_lossy(),
                );
                std::process::exit(1);
            };
            ()
        } else {
            eprintln!("{}EXTENSION not …
Run Code Online (Sandbox Code Playgroud)

parallel-processing rust rayon

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

用于暴露公共字段同时限制直接结构构造的 Rust 习惯用法

我知道 Rust 中的可见性规则和 Rust 中典型的“构造函数”模式,例如通过关联函数,通常命名为new或如果结构的所有字段都是公共的,则通过“直接”构造,例如Struct {value: 0}

只是希望了解实现以下目标的适当习惯用法是什么:

公开具有所有公共字段的公共结构,但限制直接构建。

例如

pub struct MyStruct {
    pub val: u8,
}

impl MyStruct {
    pub fn new(val: u8) {
        MyStruct {val}
    }
}
Run Code Online (Sandbox Code Playgroud)

外部板条箱可以执行此操作:

use your_crate::MyStruct;

let your_struct = MyStruct::new(8);
println!("{}", your_struct.val);
//8
Run Code Online (Sandbox Code Playgroud)

但对于外部板条箱(将其称为“your_crate”与其中MyStruct定义的“my_crate”)来说不行:

use my_crate::MyStruct;

let your_struct = MyStruct {val: 8};
// above should return compile error
Run Code Online (Sandbox Code Playgroud)

我知道有两种方法可以实现这一目标。

  1. 使用getterandsetter方法并将字段设为私有。
pub struct MyStruct {
    val: u8,
}

impl MyStruct {
    pub fn new(val: …
Run Code Online (Sandbox Code Playgroud)

constructor visibility rust

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