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
相关产品推荐
相关产品推荐

