我希望用户将命令行参数传递给我用 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.");
}
有这样的方法吗?这让我可以测试除了 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.");
}
关于enums - 用 bool 值检查 Rust 枚举的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17014839/