You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:24:23