enums - 用 bool 值检查 Rust 枚举的类型?

标签 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."); 
}

有这样的方法吗?这让我可以测试除了 match 之外还有哪个枚举成员。 ?

最佳答案

枚举的变体都是相同的类型(在这种情况下,NoneSome(foo) 都是 Option<int> ),所以您实际上想要做的是检查哪个变体 startend是。幸运的是,Rust 提供了多种选择。

您的代码的直接翻译是使用 start.is_some() && end.is_some() .但是,这需要将格式字符串修改为 fmt!("You entered: %d, %d", start.get(), end.get()) ,因为 startend不是整数,但仍包含在 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/

相关文章:

grails - Grails如何将枚举映射到数据库上的现有枚举

objective-c - objective-c :componentsSeperatedByRegex

python - 匹配字符串后还想打印下一行

rust - 如何将编译器标志传递给 Rust 中的子 crate ?

rust - "box"关键字有什么作用?

rust - Rust类型别名导致生命周期问题

c++11 - 枚举 : int and enum : const int 之间有什么区别吗

c++ - 如何在 Boost 枚举中使用 switch 语句

enums - ModelMapper 不映射

shell - 仅当在 sed 中匹配时才打印特定行号