Rust 为什么火柴从不使用第二个火柴臂?
我正在尝试使用来自不同平台的原始数据重新实现前两个最终幻想游戏。我想使用getopts板条箱获取两个程序参数,并使用Rust 为什么火柴从不使用第二个火柴臂?,rust,match,getopts,Rust,Match,Getopts,我正在尝试使用来自不同平台的原始数据重新实现前两个最终幻想游戏。我想使用getopts板条箱获取两个程序参数,并使用match处理这两个参数,但它只执行第一个match元素。我想我把类型搞砸了 也许还有别的办法?我无法使用官方的Rust文档,互联网上的任何教程都不太友好 代码如下: let args: Vec<String> = env::args().map(|x| x.to_string()).collect(); if(args.len() < 3) { pri
match
处理这两个参数,但它只执行第一个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.")
}
let args:Vec=env::args().map(|x | x.to_string()).collect();
if(args.len()<3){
println!(“=======错误=====\n预期参数数无效:\n键入“帮助我”以获得帮助。”);
过程::退出(1);
}
让ref game=args[1];
设ref rom=args[2];
比赛{
帮助=>{
println!(“=======帮助===========”);
匹配rom{
列表=>println!(“可用游戏:ff1,ff2\n可用ROM:ff1_j_msx,ff1_j_nes,ff1_,ff1和2,ff2_j,ff2_proto”),
me=>println!(“可用帮助命令:\nlist->可用游戏和ROM列表。\nme->此帮助”),
_=>println!(“=======错误======\n无效的帮助命令。”)
}
},
_=>println!(“===错误====\n无效游戏,请键入“帮助我”以获得帮助。”)
}
您确实需要阅读编译器的错误和警告消息。此代码有七个警告。如果你已经解决了其中的任何一个问题,你将更接近于自己解决问题。如果你把所有的问题都解决了,你的问题就会消失
下面是一个具有代表性的警告,编译器会准确地告诉您问题是什么:
警告:无法访问的模式
-->src/main.rs:24:5
|
24 |=>println!(“======错误=====\n无效游戏,请键入“帮助我”以获得帮助。”)
|^这是一个无法访问的模式
|
=注意:#[警告(无法访问的_模式)]默认打开
注意:此模式匹配任何值
-->src/main.rs:15:5
|
15 |帮助=>{
| ^^^^
如果只使用帮助
,则会创建一个新变量,该变量的值与所匹配的值相同。在这种情况下,它会匹配所有内容,因此后续的ARM永远无法匹配
相反,您需要匹配字符串文字:
match game.as_str() {
"help" => {
match rom.as_str() {
"list" => /* ... */,
"me" => /* ... */,
_ => /* ... */,
}
},
_ => /* ... */,
}
我强烈建议您返回并重新阅读。这是保存大量初学者文档的地方。具体来说,您应该从头到尾阅读。您确实需要阅读编译器错误和警告消息。此代码有七条警告。如果您已经解决了如果你能解决所有的问题,你的问题就会消失
下面是一个具有代表性的警告,编译器会准确地告诉您问题是什么:
警告:无法访问的模式
-->src/main.rs:24:5
|
24 | =>println!(“===错误====\n无效游戏,请键入“帮助我”以获得帮助。”)
|^这是一个无法访问的模式
|
=注意:#[警告(无法访问的_模式)]默认打开
注意:此模式匹配任何值
-->src/main.rs:15:5
|
15 |帮助=>{
| ^^^^
如果只使用帮助
,则会创建一个新变量,该变量的值与所匹配的值相同。在这种情况下,它会匹配所有内容,因此后续的ARM永远无法匹配
相反,您需要匹配字符串文字:
match game.as_str() {
"help" => {
match rom.as_str() {
"list" => /* ... */,
"me" => /* ... */,
_ => /* ... */,
}
},
_ => /* ... */,
}
我强烈建议您回去重新阅读。这是保存大量初学者文档的地方。具体来说,您应该从头到尾阅读。您在示例中不使用它。您想不想使用它?这不是您问题的答案,而是另一个库:是最方便用户的吗我在Rust中见过命令行解析器。@Stargateur oops您是对的:)我想使用它,但有时我忘记了。您在示例中没有使用它。您想不想使用它?这不是对您问题的回答,而是一个替代库:是我在Rust中见过的最用户友好的命令行解析器。@Stargateur oops you是对的:)我想使用它,但有时我忘了。在git上的rust书存储库中说,“我们建议从开始。”@Stargateur是的,是的。但是,期望人们从任何他们可以合理找到的地方阅读没有链接的文档是不公平的。明天发布后,我将不得不通过数千个SO答案来更新链接。是的,我在代码中有其他警告,但我没有注意到(我现在可能会仔细看一下)。我尝试过并弄糟的是,我试图在某个时候将这些变量转换为字符串类型而不是str,因为编译器清楚地告诉我,它“^^^^^^^^^^^^^预期的struct
std::String::String
,find str”rust book的git存储库说“我们建议从以下方面开始。“@Stargateur是的,是的。但是,期望人们从任何他们可以合理找到的地方阅读没有链接的文档是不公平的。明天发布后,我将不得不通过数千个SO答案来更新链接。是的,我在代码中有其他警告,但我没有注意到(我现在可能会仔细看一下)。我尝试过并弄糟的是,我试图在某个时候将这些变量转换为字符串类型而不是str,因为编译器清楚地告诉我它“^^^^^^^^^^^预期的结构std::String::String
,找到str”