6

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

4

1 回答 1

7

枚举的变体都是相同的类型(在这种情况下,两者都是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.");
}
于 2013-06-10T00:17:51.663 回答