我正在尝试使用一个 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) 我正在尝试使用 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, ®ex_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) 我知道 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)
我知道有两种方法可以实现这一目标。
getterandsetter方法并将字段设为私有。pub struct MyStruct {
val: u8,
}
impl MyStruct {
pub fn new(val: …Run Code Online (Sandbox Code Playgroud)