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

Rust使用scan_fmt时出现类型不匹配错误:Result与Option不兼容

问题分析与解决

核心问题1:类型不匹配的根源

scan_fmt! 宏默认返回 Option<(T1, T2, ...)>,你期望的 Result<(i32, i32), ScanError> 需要使用专门的 scan_fmt_result! 宏获取,这是类型不匹配错误的直接原因。

核心问题2:无效的方法调用

代码中对 i32 类型变量调用 trim() 是错误的——trim() 是字符串类型的方法,数值类型没有这个方法。而且 scan_fmt 解析时会自动忽略输入中的空白字符(包括换行符),不需要手动处理数值的“换行符修剪”。

修正后的代码

use scan_fmt::{scan_fmt, scan_fmt_result};
use std::io;
use scan_fmt::ScanError;

fn main() {
    let mut input = String::new();

    io::stdin()
        .read_line(&mut input)
        .expect("读取输入时出错");

    // 使用 scan_fmt! 处理 Option 返回值
    if let Some((n1, d1)) = scan_fmt!(&input, "{}/{}", i32, i32) {
        println!("输入读取成功: {}/{}", n1, d1);
    } else {
        println!("格式不匹配...");
    }

    input.clear();
    io::stdin()
        .read_line(&mut input)
        .expect("读取输入时出错");

    // 使用 scan_fmt_result! 处理 Result 返回值(符合你期望的类型)
    match scan_fmt_result!(&input, "{}/{}", i32, i32) {
        Ok((n2, d2)) => println!("输入读取成功: {}/{}", n2, d2),
        Err(e) => match e {
            ScanError::Io(_) => println!("IO错误"),
            ScanError::Format => println!("格式不匹配..."),
            ScanError::Conversion => println!("数值转换失败"),
        },
    }
}

关键说明

  • 若需要 Result 类型返回值,替换 scan_fmt! 为 scan_fmt_result!,通过 match 处理 Ok 和 Err 分支。
  • 数值类型无需调用 trim(),scan_fmt 会自动跳过输入中的空白字符(换行、空格等)。
  • 若要从单行读取两个分数,只需将格式字符串调整为 "{}/{} {}/{}",一次性解析四个数值即可。

内容的提问来源于stack exchange,提问作者Lmezzz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:57:33