< 返回版块

archon 发表于 2024-06-21 15:32

最近在学习Rust,用reqwest写了一个系统的web请求的客户端程序

type Error = Box<dyn std::error::Error>;
type Result<T, E = Error> = std::result::Result<T, E>;

pub async fn login(client: &Client, username: &str, password: &str) -> Result<bool> {
        ...... //处理一些参数之类
        let req = client.post(&request_url)
                        .form(&login_param)
                        .send()
                        .await?
                        .text()
                        .await?;
       //然后处理req,根据返回的信息是否成功
       ......
       Ok(true)
}

#[tokio::main]
async fn main() -> Result<()> {
    let args = env::args().collect::<Vec<String>>();
    if args.len() != 5 {
        panic!("Usage: {} URL USERNAME PASSWORD ID...", args[0]);
        //这里原来也是用 println! 然后 Ok(())    
    }
      
    ..... //处理一些参数
    //reqwest::Client
    let ret = login(&client, &username, &pwd).await?;
    if !ret {
       //判断web请求返回的是否成功,假如失败就返回
       //这里和上面的判断是一样,但是不想用panic,
       Ok(())
       //一开始是用 Ok(()),但是这样不太对,作为一个失败函数怎么可能返回Ok(())呢,这样在 Powershell 里面 $? 一直是true的,我想在操作失败后返回个Error 代表失败,Shell里面也能通过$?判断失败
       
       Err("Login Failed!") //不行
       Err(()) //不行

    }

    //后面还有一系列的操作,和login差不多

后面我尝试手动处理一下await?

let ret = login(&client, &username, &pwd).await

match let { //然后返回 Err(e)
  Err(e) => return e 
}

这样在if 里面是可以返回 Err("xxx") 但是在main函数最后提示 Ok(()) //类型不匹配 一大堆类型错误 Ok(()) expected std::result::Result<(), Box<(dyn StdError + 'static)>> because of return type

最后就是不管怎么处理都是类型不匹配,头都大了,像这样应该怎么处理Result?

评论区

写评论
作者 archon 2024-06-24 11:35

确实是没有return,已解决,thx。

--
👇
munpf: 你是不是没有return,直接写了Err("Login Failed!".into())

👇
archon: 这个不行, 我改成 Err("Login Failed!".into()) 之后就提示 mismatched types expected unit type () found enum std::result::Result<_, _>

munpf 2024-06-24 10:13

你是不是没有return,直接写了Err("Login Failed!".into())

👇
archon: 这个不行, 我改成 Err("Login Failed!".into()) 之后就提示 mismatched types expected unit type () found enum std::result::Result<_, _>

作者 archon 2024-06-24 09:40

不传指针吗?现在刚学,我也只是基本类型不传指针,直接传值; match结果之后,要怎么返回呢?

--
👇
lithbitren: reqwest::Client我见人代码一般都是不传指针的,下面两种写法一般问题不大。

    if let Err(err) = login(client, &username, &pwd).await {
        println!("err: {err}");
    }
    match login(client, &username, &pwd).await {
        Ok(ok) => println!("Ok: {ok}"),
        Err(err) => println!("Err: {err}")
    }

!ret的问题在于ret为Ok的时候是bool,为Err的时候是Error,不能取非

作者 archon 2024-06-24 09:38

好吧,其实我也是知道用anyhow,但是我是想在没有anyhow的情况下处理这个情况

--
👇
lsk569937453: 你需要anyhow,返回Result<(),anyhow::Error>,想要显示的返回error就用Err(anyhow!("This is error")).

作者 archon 2024-06-24 09:37

这个不行, 我改成 Err("Login Failed!".into()) 之后就提示 mismatched types expected unit type () found enum std::result::Result<_, _>

👇
Zhou-Pixel: 就是类型不匹配 可以改成 Err("Failed".into())

Zhou-Pixel 2024-06-22 10:28

就是类型不匹配 可以改成 Err("Failed".into())

lsk569937453 2024-06-22 08:54

你需要anyhow,返回Result<(),anyhow::Error>,想要显示的返回error就用Err(anyhow!("This is error")).

lithbitren 2024-06-21 19:24

reqwest::Client我见人代码一般都是不传指针的,下面两种写法一般问题不大。

    if let Err(err) = login(client, &username, &pwd).await {
        println!("err: {err}");
    }
    match login(client, &username, &pwd).await {
        Ok(ok) => println!("Ok: {ok}"),
        Err(err) => println!("Err: {err}")
    }

!ret的问题在于ret为Ok的时候是bool,为Err的时候是Error,不能取非

1 共 8 条评论, 1 页