用布尔值检查Rust枚举的类型?

lim*_*imp 5 enums match rust

我希望用户将命令行参数传递给我在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

huo*_*uon 6

枚举的变体都是同一类型(在这种情况下,无论是NoneSome(foo)Option<int>),让你真正想要做的是检查哪些变异startend有.幸运的是,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)