Rust实现猜数字游戏报expected `i16`, found `Result`类型不匹配错误
错误原因
编译器抛出该错误的核心原因是类型不匹配:
- 你写的
let number: i16 = number.trim().parse::<i16>().unwrap();这行代码,已经通过unwrap()把parse()方法返回的Result<i16, ParseIntError>枚举强制拆包成了i16类型的整数,此时number变量的类型是纯整数,不是Result枚举。 - 后续你对
i16类型的number做match匹配时,写的Ok(ok)、Err(e)都是Result枚举的专属变体,i16类型根本不存在这些变体,编译器自然会提示你期望匹配i16类型,却拿到了Result枚举的分支。 - 附带逻辑bug:你提前调用
unwrap()的写法,一旦用户输入非数字内容,程序会直接panic崩溃,根本走不到你后面写的“提示输入不合法”的分支;而且你原来的match分支里解析成功就直接continue跳回循环开头,永远不会执行后面判断猜数是否正确的逻辑,和预期效果完全不符。
修复方案
去掉多余的unwrap()调用,直接对parse()返回的Result做匹配,在match分支里分别处理成功、失败的场景,修正后的核心段代码如下:
read(&mut number); // 直接匹配parse返回的Result,成功才绑定i16值给number,失败则提示后重开一轮 let number: i16 = match number.trim().parse::<i16>() { Ok(valid_num) => valid_num, Err(_) => { println!("No number could be found"); continue; } }; // 删掉原来错误的match number { Ok/Err... } 那段代码,直接往下走猜数判断逻辑 read(&mut killcheck); if killcheck.trim() == "end" { println!("error is null"); process::exit(0x0100); } if number == rand_ { println!("Correct!\n") } else { println!("Incorrect!\n") }
其他可选优化点:
- 你原来对随机数范围提示的match分支存在重复覆盖:
1..=5和5..=10都包含了5,可以调整为1..=4对应1-4的提示、5..=10对应5-10的提示,消除逻辑冗余。 - 判断数字相等、不等的两个if分支可以合并成
if/else,不需要写两次独立判断。
内容的提问来源于stack exchange,提问作者sharkanoly
相关产品推荐
相关产品推荐

