Dan*_*Dan 4 rust reqwest rust-result
我正在尝试泛化函数Result返回的a reqwest::blocking::get。它返回 aResult<reqwest::blocking::Response, reqwest::Error>但调用它的函数返回 a Result<reqwest::blocking::Response, Box<dyn std::error::Error>。
这是第一次尝试:
fn get_example_fails() -> Result<Response, Box<dyn Error>> {
let result = blocking::get("http://example.com");
result.map_err(|error| Box::new(error))
}
Run Code Online (Sandbox Code Playgroud)
它有以下错误,我不知道如何修复,但觉得通过一些小的调整可能会更惯用 - 但我不确定要调整什么:
error[E0308]: mismatched types
--> src/bittrex.rs:143:9
|
141 | fn get_example_fails() -> Result<Response, Box<dyn Error>> {
| -------------------------------- expected `Result<reqwes
t::blocking::Response, Box<(dyn StdError + 'static)>>` because of return type
142 | let result = blocking::get("http://example.com");
143 | result.map_err(|error| Box::new(error))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn StdError`,
found struct `reqwest::Error`
|
= note: expected enum `Result<_, Box<(dyn StdError + 'static)>>`
found enum `Result<_, Box<reqwest::Error>>`
Run Code Online (Sandbox Code Playgroud)
这个尝试可以编译,但看起来很冗长:
error[E0308]: mismatched types
--> src/bittrex.rs:143:9
|
141 | fn get_example_fails() -> Result<Response, Box<dyn Error>> {
| -------------------------------- expected `Result<reqwes
t::blocking::Response, Box<(dyn StdError + 'static)>>` because of return type
142 | let result = blocking::get("http://example.com");
143 | result.map_err(|error| Box::new(error))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn StdError`,
found struct `reqwest::Error`
|
= note: expected enum `Result<_, Box<(dyn StdError + 'static)>>`
found enum `Result<_, Box<reqwest::Error>>`
Run Code Online (Sandbox Code Playgroud)
这是因为编译器在这里过于热心。请注意,Box::new(error)只需输入errora Box,即可获得强类型的Box<reqwest:Error>,正如编译器报告的那样。但是您想要的是 的特征对象dyn Error,这Box<reqwest:Error>可能是,但编译器不会做出类型弱化的假设。修复方法是手动明确这一点:
fn get_example_fails() -> Result<Response, Box<dyn Error>> {
let result = blocking::get("http://example.com");
result.map_err(|error| Box::new(error) as Box<dyn Error>)
}
Run Code Online (Sandbox Code Playgroud)
请注意 extra ,它向编译器明确表明该值应该向下转换,并且它是中的as Box<dyn Error>具体值这一事实应该被删除。reqwest::ErrorBox
第二个示例编译良好的原因是类型推断。在第一个示例中,从函数返回的类型将是从 返回的类型.map_err(),即Result<Response, Box<reqwest::Error>>- 就是这样。类型不匹配,因此会出现错误。在第二个例子中,match构造了一个全新的Result,Rust 必须为此推断T和;E所以类型推断开始。在第二种情况下,由于函数的返回值而进行的推断对于 而言是成功的Box<dyn Error>。但是对于map_err(),类型推断无法“查看”-bodymap_err()并削弱它的返回类型;已经太晚了,类型已经固定了。这就是为什么您必须按照上面的建议手动执行此操作。
| 归档时间: |
|
| 查看次数: |
3742 次 |
| 最近记录: |