如何从函数返回当前工作目录?

pr0*_*gas 27 rust rust-cargo

具有高级编程语言的经验。我读了 Rust 这本书,现在试图生存并理解 Rust 中的“事物”是如何工作的。我希望有人解释一下到底是什么 - Ok(()) 以及如何处理它?我的目标是将函数的结果返回到输出的变量:

    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/rcp ./file/ aba`
Ok(
    "/home/tomand/rcp",
)
Run Code Online (Sandbox Code Playgroud)

这是完整的代码:

use std::fs;
use std::env;
use serde_json;
use regex::Regex;
use std::path::Path;

fn determinate_file_size(file: &str) -> u64 {
    fs::metadata(file).unwrap().len()
}

fn determinate_is_it_file_or_dirctory(arg: &str) -> &str {
    let file = "File";
    let dir = "Directory";
    let re = Regex::new(r"/").unwrap();
    if re.is_match(arg) {
        return dir;
    }
    return file;
}

fn collect_user_arguments() -> Vec<String> {
    env::args().collect()
}

fn check_if_arguments_count_valid(args: &Vec<String>) -> bool {
    if args.len() == 3 {
        return true
    }
    help();
    return false
}

fn get_current_working_dir() -> Result<T> {
    env::current_dir()
}

fn help() {
    println!("Examples:");
    println!("rcp [srcfile] [destfile]");
    println!("rcp [srcdir]/[srcfile] [destdir]/[destfile]");
}


fn main() {
    let WORKING_DIR = get_current_working_dir();
    let args: Vec<String> = collect_user_arguments();

    if check_if_arguments_count_valid(&args) {
        let arg1 = &args[1];
        let arg2 = &args[2];
        println!("{:#?}", determinate_is_it_file_or_dirctory(&arg1));
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎编译器试图给我一些灵感,但最终我们沟通错误:

error[E0107]: this enum takes 2 generic arguments but 1 generic argument was supplied
   --> src/main.rs:42:33
    |
42  | fn get_current_working_dir() -> Result<T> {
    |                                 ^^^^^^ - supplied 1 generic argument
    |                                 |
    |                                 expected 2 generic arguments
Run Code Online (Sandbox Code Playgroud)

编辑:我采用了这种方法:

fn get_current_working_dir() -> String {
    let res = env::current_dir();
    match res {
        Ok(path) => path.into_os_string().into_string().unwrap(),
        Err(_) => "FAILED".to_string()
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎需要更多的练习来理解Result类型以及如何管理它。

Net*_*ave 40

std::env::current_dir返回 a std::io::Result<Pathbuf>,因此您需要在包装方法中使用该类型:

fn get_current_working_dir() -> std::io::Result<PathBuf> {
    env::current_dir()
}
Run Code Online (Sandbox Code Playgroud)

操场

其他挑剔:

const不是一种类型,所以let WORKING_DIR: const = get_current_working_dir();是错误的,就let WORKING_DIR = get_current_working_dir();足够了。