我希望用户将命令行参数传递给我在Rust中编写的简单函数.我知道我可以int::from_str(args[1])用来转换,但这会返回一个Option<int>,这意味着为了将它传递给一个函数,int如下所示,我必须使用一个match语句.但是有了n个参数,就有2 ^ n种可能性.match用一些东西编写一系列嵌套语句会很糟糕.如果有办法做某事,那将是理想的:
// will return either Some(int) or None
let start = int::from_str(args[1]), end = int::from_str(args[2]);
if typeof(start) == Some && typeof(end) == Some {
println(fmt!("You entered: %d, %d", start, end);
} else {
println("Error with arguments.");
}
Run Code Online (Sandbox Code Playgroud)
有没有这样的方法?这让我可以测试枚举中的哪个成员match?
枚举的变体都是同一类型(在这种情况下,无论是None和Some(foo)是Option<int>),让你真正想要做的是检查哪些变异start和end有.幸运的是,Rust提供了多种选择.
您的代码的直接翻译将被使用start.is_some() && end.is_some().但是,这需要将格式字符串修改为fmt!("You entered: %d, %d", start.get(), end.get()),因为start并且end不是整数,但仍包含在Some(...)变体中.(此变体测试必须以每个枚举为基础编写,没有内置函数允许您对任何枚举执行测试.)
更惯用的方式是这样的:
// will return either Some(int) or None
let start_opt = int::from_str(args[1]), end_opt = int::from_str(args[2]);
match (start_opt, end_opt) {
// only matches if both are Some
(Some(start), Some(end)) => println(fmt!("You entered: %d, %d", start, end),
// will match when either (or both) are None
_ => println("Error with arguments.");
}
Run Code Online (Sandbox Code Playgroud)