拥有高级编程语言的经验。我读了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类型以及如何管理它。
env.current_dir()
周围的println!
,然后它告诉我返回类型为Result<PathBuf,std::io::Error>
。将其作为函数的返回类型(尽管该函数似乎毫无用处)并且一切正常。 - MasklinnResult<T>
在多个层面上都没有意义:首先,尽管几个模块“部分应用”其中一个参数以拥有它们自己的结果(例如std::io::Result<T>
是别名为std::result::Result<T, std::io::Error>
),但主Result
类型不是这种情况;其次,在一个自由函数中使用<T>
意味着调用者必须以某种方式提供类型,而在这里却无法做到,因为current_dir()
在任何方面都不是泛型的。 - Masklinn