2017-06-07 10 views
0

私はさまざまなプラットフォームの元のデータを使用して、最初の2つのファイナルファンタジーゲームを再実装しようとしています。私はgetoptsのクレートを使用して2つのプログラム引数を取得し、matchを使用して両方を処理したいが、最初の一致要素を実行するだけである。私はタイプで何かをねじ込んだと思う。なぜマッチで2番目のマッチアームを使用しないのですか?

多分、別の方法がありますか?私は公式の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

あなたの例では、[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

あなたが本当には、コンパイラのエラーおよび警告メッセージを読む必要があります。このコードは7つの警告を持っています。もしあなたがそれらのいずれかに対処していたら、自分で問題を解決することにもっと近づくでしょう。あなたがそれらのすべてを修正したら、あなたの問題はなくなるでしょう。あなたが一致している値で新しい変数を作成します

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)では、「第2版」(http:/trust-lang.github.io/book/secondedition)。 " – Stargateur

+0

@Stargateurうん、そうです。しかし、合理的に見つけられた場所からリンクされていないドキュメントを読んでいると期待するのは公正ではありません。明日のリリース後、[公式のドキュメントリソースは第2の本を指し示す](https://doc.rust-lang.org/beta/book/)、リンクを更新するために何千もの答えを調べなければならない。 – Shepmaster

+0

それを知らなかった、非常に良い。 – Stargateur

関連する問題