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

23

拥有高级编程语言的经验。我读了Rust的书,现在正在努力理解和生存 Rust 中的“东西”是如何工作的。我希望有人能解释一下- Ok(()) 究竟是什么,以及如何处理它?我的目标是将函数的结果返回到输出变量中:

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

这里是完整的代码:

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));
    }
}

看起来编译器试图给我一些启示,但最终我们沟通不畅:

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

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

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()
    }
}

看起来需要更多的实践才能理解Result类型以及如何管理它。


不确定您的问题是什么。我将您的代码放入playground中,删除了env.current_dir()周围的println!,然后它告诉我返回类型为Result<PathBuf,std::io::Error>。将其作为函数的返回类型(尽管该函数似乎毫无用处)并且一切正常。 - Masklinn
抛开那些,Result<T> 在多个层面上都没有意义:首先,尽管几个模块“部分应用”其中一个参数以拥有它们自己的结果(例如 std::io::Result<T> 是别名为 std::result::Result<T, std::io::Error>),但主 Result 类型不是这种情况;其次,在一个自由函数中使用 <T> 意味着调用者必须以某种方式提供类型,而在这里却无法做到,因为 current_dir() 在任何方面都不是泛型的。 - Masklinn
1个回答

34

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

fn get_current_working_dir() -> std::io::Result<PathBuf> {
    env::current_dir()
}

Playground

另外一个小问题:

const 不是一个类型,所以 let WORKING_DIR: const = get_current_working_dir(); 是错误的写法,只需写成 let WORKING_DIR = get_current_working_dir(); 即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接