我正在尝试使用来自各种平台的原始数据重新实现前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.")
}
答案 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 match
和the chapter on patterns向上阅读。