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

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(())
}

补充说明

  1. ?操作符仅能在返回Result或Option的函数中使用,刚好匹配你的main_loop返回Result<()>的场景。
  2. 替换expect为?后,数据库操作的错误会被统一封装到返回值中,而非直接崩溃,你可以在调用main_loop的入口处统一处理错误,比如打印友好提示后退出程序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:01:01