预期的 struct Config,在使用 process::exit 时找到 ()

Dan*_*Dan 1 error-handling closures traits rust

我是 Rust 新手,正在阅读官方书籍。我正在研究一个简单的 grep 示例,并希望创建一个exit可以在不同地方使用的函数。不幸的是,在闭包中使用此函数unwrap_or_else会导致编译错误。我不清楚为什么,因为当我直接在闭包中使用函数的内容时,它会起作用。

这是我的main.rs文件:

use std::env;
use std::fs;
use std::process;
use std::error::Error;
use std::fmt::Display;

struct Config{
    query: String,
    filename: String,
}

impl Config {
    fn new(input: &[String]) -> Result<Config, &'static str> {
        if input.len() < 3 {
            return Err("Not enough arguments provided.");
        }
        let query = input[1].clone();
        let filename = input[2].clone();

        Ok(Config { query, filename })
    }
}

fn run(cfg: Config) -> Result<(), Box<dyn Error>> {
    let contents = fs::read_to_string(&cfg.filename)?;
    contents.find(&cfg.query).expect("Corrupted text file.");

    Ok(())
}

fn exit<T: Display>(msg: &str, err: T) {
    println!("{}: {}", msg, err);
    process::exit(1);
}

fn main() {
    let args: Vec<String> = env::args().collect();
    println!("{:?}", args);

    let cfg = Config::new(&args).unwrap_or_else(|err| {
        exit("Problem parsing arguments", err);
    });
    
    if let Err(err) = run(cfg) {
        exit("Application error", err);
    }
}

Run Code Online (Sandbox Code Playgroud)

这是编译错误:

use std::env;
use std::fs;
use std::process;
use std::error::Error;
use std::fmt::Display;

struct Config{
    query: String,
    filename: String,
}

impl Config {
    fn new(input: &[String]) -> Result<Config, &'static str> {
        if input.len() < 3 {
            return Err("Not enough arguments provided.");
        }
        let query = input[1].clone();
        let filename = input[2].clone();

        Ok(Config { query, filename })
    }
}

fn run(cfg: Config) -> Result<(), Box<dyn Error>> {
    let contents = fs::read_to_string(&cfg.filename)?;
    contents.find(&cfg.query).expect("Corrupted text file.");

    Ok(())
}

fn exit<T: Display>(msg: &str, err: T) {
    println!("{}: {}", msg, err);
    process::exit(1);
}

fn main() {
    let args: Vec<String> = env::args().collect();
    println!("{:?}", args);

    let cfg = Config::new(&args).unwrap_or_else(|err| {
        exit("Problem parsing arguments", err);
    });
    
    if let Err(err) = run(cfg) {
        exit("Application error", err);
    }
}

Run Code Online (Sandbox Code Playgroud)

当我将Config::new(&args).unwrap_or_else闭包更改为此时,它会起作用:

let cfg = Config::new(&args).unwrap_or_else(|err| {
    println!("Problem parsing arguments: {}", err);
    process::exit(1);
});
Run Code Online (Sandbox Code Playgroud)

use*_*123 5

我也被困在这个问题上了。需要导入流程库:

use std::process;
Run Code Online (Sandbox Code Playgroud)

编辑:第二次查看时,您确实导入了它。对于遇到这个问题的其他人来说,那是我的问题。我遇到了同样的错误。