我正在尝试将由
reqwest::blocking::get
函数返回的Result
泛型化。它返回一个Result<reqwest::blocking::Response, reqwest::Error>
,但调用该函数的函数则返回一个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))
}
以下是我不知道如何修复的错误,但我感觉通过一些微调可能会更加习惯用语 - 但我不确定需要微调什么:
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>>`
这个尝试编译通过了,但似乎有些啰嗦:
fn get_example_works() -> Result<Response, Box<dyn Error>> {
let result = blocking::get("http://example.com");
match result {
Ok(resp) => Ok(resp),
Err(error) => Err(Box::new(error)),
}
}
dyn Error
的特质对象,而Box<reqwest:Error>
可以是。我不同意。你可以从Box<reqwest:Error>
创建一个Box<dyn Error>
,但是一个Box<reqwest:Error>
不能成为(或者“被用作”,等等)一个Box<dyn Error>
(例如,因为Box<reqwest:Error>
内部只包含一个指针,而Box<dyn Error>
包含两个)。 - undefined