Rust简单CSV读取函数返回类型不匹配报错如何解决
问题解决
错误根源
- 初次报错的核心原因是
csv::Reader::from_path本身返回Result<csv::Reader, csv::Error>枚举,用来表示文件读取可能出现的失败场景,你直接声明返回csv::Reader类型,和实际返回值类型不匹配。 - 修改后的代码仍然存在两个问题:
- 函数声明返回
csv::Result<csv::Reader<File>>,要求返回值必须是Ok(Reader实例)或者Err(错误实例),但你在Err处理分支直接空返回,不符合类型约束 - main函数中使用了
?错误传播运算符,但默认main函数返回值为(),不支持?语法,需要修改main的返回类型
- 函数声明返回
正确实现方案
方案1:使用?运算符传播错误(生产环境推荐)
首先导入依赖:
use std::fs::File; use csv::Reader;
修改后的完整代码:
fn main() -> Result<(), Box<dyn std::error::Error>> { let input = "./assets/input.csv"; let list = get_csv(input)?; for result in list.records() { let record = result?; println!("{:?}", record); } Ok(()) } fn get_csv(filepath: &str) -> csv::Result<csv::Reader<File>> { let reader = csv::ReaderBuilder::new() .delimiter(b';') .from_path(filepath)?; Ok(reader) }
方案2:简单场景直接终止程序(测试场景可用)
如果不需要上层处理错误,遇到问题直接终止程序,可以用expect/unwrap直接取出Result的成功值,失败时直接panic:
use std::fs::File; use csv::Reader; fn main() { let input = "./assets/input.csv"; let list = get_csv(input); for result in list.records() { let record = result.expect("读取CSV行失败"); println!("{:?}", record); } } fn get_csv(filepath: &str) -> csv::Reader<File> { csv::ReaderBuilder::new() .delimiter(b';') .from_path(filepath) .expect("打开CSV文件失败") }
内容的提问来源于stack exchange,提问作者TheDomis4
相关产品推荐
相关产品推荐

