2017-06-07 78 views
0

我正在嘗試使用來自各種平臺的原始數據重新實現前2個最終幻想遊戲。我想使用getopts crate獲取2個程序參數,並通過使用match來處理它們,但它只是執行第一個匹配元素。我想我搞砸了一些類型的東西。爲什麼比賽從不使用第二場比賽?

也許有另一種方法可以做到嗎?我失去了使用官方Rust文檔和互聯網上的任何教程都不是真正的noob友好。

下面是代碼:

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

在你的例子中你不使用[getopts](https://doc.rust-lang.org/getopts/getopts/index.html)。你想用還是不用? – Stargateur

+6

不是您的問題的答案,而是另一個庫:[Clap](https://github.com/kbknapp/clap-rs#quick-example)是我在Rust中看到的用戶友好的命令行解析器。 –

+0

@Stargateur哎呀你是對的:)我想用它,但有時我忘了。 – user160995

回答

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

+0

生鏽書的git倉庫中的[readme](https://github.com/rust-lang/book/blob/master/README.md)說:「我們建議從[第二版]開始(http:///rust-lang.github.io/book/second-edition)。「 – Stargateur

+0

@Stargateur是的,它的確如此。然而,期望人們閱讀文檔並不能從他們合理找到的任何地方連接起來,這是不公平的。明天發佈後[官方文檔資源將指向第二本書](https://doc.rust-lang.org/beta/book/),我將不得不通過數以千計的SO答案更新鏈接。 – Shepmaster

+0

不知道,非常好。 – Stargateur