Rust Match语句因Result枚举类型不匹配报错求助
Rust Match分支类型不匹配:期望
()却得到Result<(), rusqlite::Error> 你的问题核心是内部Match分支返回类型不一致:"new"分支调用insert_number返回了Result<()>,但exit/_分支的返回类型是单元类型(),Rust要求Match的所有分支必须返回相同类型。
解决方法
由于main_loop函数本身返回Result<()>, 可以用?操作符处理insert_number的返回值:它会自动解包成功结果(得到()),如果出错则直接将错误向上传播,完全符合函数的返回类型要求。
另外,建议把insert_number里的expect换成?,避免程序直接panic,而是将错误以Result形式返回,更贴合Rust的错误处理习惯。
修改后的代码
cli.rs/main_loop():
pub async fn main_loop() -> Result<()> { banner(); desc(); let conn = Connection::open("db.db")?; // 把expect换成?,统一错误处理逻辑 util::db::check_db(&conn).await?; // 若check_db返回Result,同样用?处理 let mut user_input: Vec<String>; let mut rl = Editor::<()>::new(); if rl.load_history(".history").is_err() { println!("no previous history..."); } println!("\t\t type 'new <number>' to add a number to the db"); println!("\t\t type 'exit' to leave configuration mode\n"); loop { let readline = rl.readline("CONFIG# "); match readline { Ok(line) => { user_input = get_string_vec(line); match user_input[0].as_str() { "new" => util::db::insert_number(&conn, user_input).await?, // 添加?处理Result "exit" => break, _ => continue, } }, Err(ReadlineError::Interrupted) => { println!("ctrl+c pressed. quitting now.."); std::process::exit(0); }, Err(ReadlineError::Eof) => { println!("ctrl+d pressed. quitting now.."); std::process::exit(0); }, Err(err) => { println!("error: {:?}", err); std::process::exit(0); } } } Ok(()) }
db.rs/insert_number():
pub async fn insert_number(conn: &Connection, args: Vec<String>) -> Result<()> { conn.execute( "insert into numbers (number) values (?1)", &[args[1].as_str()], )?; // 替换expect为?,将错误包装进Result返回 Ok(()) }
补充说明
?操作符仅能在返回Result或Option的函数中使用,刚好匹配你的main_loop返回Result<()>的场景。- 替换
expect为?后,数据库操作的错误会被统一封装到返回值中,而非直接崩溃,你可以在调用main_loop的入口处统一处理错误,比如打印友好提示后退出程序。
内容的提问来源于stack exchange,提问作者zig
相关产品推荐
相关产品推荐

