最近在学习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?
1
共 8 条评论, 1 页
评论区
写评论确实是没有return,已解决,thx。
--
👇
munpf: 你是不是没有return,直接写了Err("Login Failed!".into())
👇
archon: 这个不行, 我改成 Err("Login Failed!".into()) 之后就提示 mismatched types expected unit type
()
found enumstd::result::Result<_, _>
你是不是没有return,直接写了Err("Login Failed!".into())
👇
archon: 这个不行, 我改成 Err("Login Failed!".into()) 之后就提示 mismatched types expected unit type
()
found enumstd::result::Result<_, _>
不传指针吗?现在刚学,我也只是基本类型不传指针,直接传值; match结果之后,要怎么返回呢?
--
👇
lithbitren: reqwest::Client我见人代码一般都是不传指针的,下面两种写法一般问题不大。
!ret
的问题在于ret为Ok的时候是bool,为Err的时候是Error,不能取非好吧,其实我也是知道用anyhow,但是我是想在没有anyhow的情况下处理这个情况
--
👇
lsk569937453: 你需要anyhow,返回Result<(),anyhow::Error>,想要显示的返回error就用Err(anyhow!("This is error")).
这个不行, 我改成 Err("Login Failed!".into()) 之后就提示 mismatched types expected unit type
()
found enumstd::result::Result<_, _>
👇
Zhou-Pixel: 就是类型不匹配 可以改成 Err("Failed".into())
就是类型不匹配 可以改成 Err("Failed".into())
你需要anyhow,返回Result<(),anyhow::Error>,想要显示的返回error就用Err(anyhow!("This is error")).
reqwest::Client我见人代码一般都是不传指针的,下面两种写法一般问题不大。
!ret
的问题在于ret为Ok的时候是bool,为Err的时候是Error,不能取非