一直在尝试编写一个函数来做到这一点。
fn main() -> Result<i32, i32> {
let clargs: Vec<String> = env::args().collect();
// validate command line arguments
if clargs.len() != 3 {
// clargs[0] is the name of the executable
print_usage(&clargs[0]);
return Err(1);
}
return Ok(0);
}
fn print_usage(exe_name: &String) {
eprintln!("Usage: {exe_name} <word_file> <hash_sha1>");
}
我也尝试过这个。
fn main() -> Result<(), std::io::Error> {
let clargs: Vec<String> = env::args().collect();
// validate command line arguments
if clargs.len() != 3 {
// clargs[0] is the name of the shacker1 executable
print_usage(&clargs[0]);
return Err("error: invalid number of arguments.");
}
return Ok(());
}
fn print_usage(exe_name: &String) {
eprintln!("Usage: {exe_name} <word_file> <hash_sha1>");
}
但我不知道如何将字符串转换为错误。在文档中找不到它。找不到例子。
如何返回像我在这里所做的那样的东西?
有几种可能的方法可以从 Rust 程序返回特定的错误代码。 一种是返回实现 Termination
特征的
something。 可以是
ExitCode
,代表退出状态; a Result<T, E>
,其中 T
实现 Termination
并且 E
实现 Debug
;或其他一些事情之一。
因此,返回状态代码的最简单方法是:
use std::env;
use std::process::ExitCode;
fn main() -> ExitCode {
let clargs: Vec<String> = env::args().collect();
// validate command line arguments
if clargs.len() != 3 {
// clargs[0] is the name of the executable
print_usage(&clargs[0]);
return 2.into();
}
0.into()
}
fn print_usage(exe_name: &String) {
eprintln!("Usage: {exe_name} <word_file> <hash_sha1>");
}
ExitCode
实现了 From<u8>
,因此您只需在 .into
上调用 u8
就可以了。 请注意,这为您提供了最大的灵活性,因为它允许您返回任何您想要的不成功状态。
你也可以这样做(仅显示
main
):
fn main() -> Result<(), &'static str> {
let clargs: Vec<String> = env::args().collect();
// validate command line arguments
if clargs.len() != 3 {
// clargs[0] is the name of the executable
print_usage(&clargs[0]);
return Err("invalid number of arguments");
}
Ok(())
}
这是可行的,因为
&'static str
实现了 Debug
。 请注意,这不会让您对退出状态有太多控制,这可能是也可能不是问题。
最后,您只需拨打
std::process::exit
即可。 这可以在任何地方完成,但这显示了如果您愿意的话可以如何做(仅显示 main
和 do_main
):
fn do_main() -> i32 {
let clargs: Vec<String> = env::args().collect();
// validate command line arguments
if clargs.len() != 3 {
// clargs[0] is the name of the executable
print_usage(&clargs[0]);
return 2;
}
0
}
fn main() {
std::process::exit(do_main());
}
请注意,
i32
没有实现Termination
,因此您不能使用Result<i32, i32>
作为返回类型。 您可以使用 Result<ExitCode, i32>
,但这会打印错误 i32
,您可能不希望这样,因此简单地返回 ExitCode
会更符合您的要求。