为什么匹配从不使用第二个匹配臂?

时间:2017-06-07 09:42:58

标签: rust match getopts

我正在尝试使用来自各种平台的原始数据重新实现前2个最终幻想游戏。我想使用getopts crate获得2个程序参数,并使用match处理它们,但它只执行第一个匹配元素。我想我把各种类型搞砸了。

也许有另一种方法可以做到这一点?我迷失了使用正式的Rust文档,互联网上的任何教程都不是非常友好的。

以下是代码:

let args: Vec<String> = env::args().map(|x| x.to_string()).collect();

if(args.len() < 3) {
    println!("=====ERROR=====\nInvalid number of parameters\nExpected: <gamename> <gamerom>\nType in: 'help me' to get some help.");
    process::exit(1);
}

let ref game = args[1];
let ref rom = args[2];

match game {
    help => {
        println!("=====HELP======");

        match rom {
            list => println!("Available games: ff1, ff2\nAvailable roms: ff1_j_msx, ff1_j_nes, ff1_u, ff1and2, ff2_j, ff2_u_proto"),
            me => println!("Available help commands:\nlist -> List of available games and roms.\nme -> This help"),
            _ => println!("=====ERROR=====\nInvalid help command.")
        }
    },
    _ => println!("=====ERROR=====\nInvalid game, type in 'help me' to get some help.") 
}

1 个答案:

答案 0 :(得分:5)

确实需要阅读编译器错误和警告消息。此代码有警告。如果你已经解决了他们中的任何一个问题,你就会更接近自己解决问题。如果你修复了所有这些问题,你的问题就会消失。

这是一个代表性的警告,编译器会告诉你究竟是什么问题:

warning: unreachable pattern
  --> src/main.rs:24:5
   |
24 |     _ => println!("=====ERROR=====\nInvalid game, type in 'help me' to get some help.")
   |     ^ this is an unreachable pattern
   |
   = note: #[warn(unreachable_patterns)] on by default
note: this pattern matches any value
  --> src/main.rs:15:5
   |
15 |     help => {
   |     ^^^^

当您仅使用help时,会创建一个具有您匹配值的新变量。在这种情况下,它匹配所有,因此后续的武器永远不会匹配。

相反,您需要匹配字符串文字:

match game.as_str() {
    "help" => {
        match rom.as_str() {
            "list" => /* ... */,
            "me" => /* ... */,
            _ => /* ... */,
        }
    },
    _ => /* ... */,
}

强烈建议您返回并重新阅读The Rust Programming Language。这是很多初学者文档保存的地方。具体来说,您应该从头开始阅读,然后通过the chapter on matchthe chapter on patterns向上阅读。