我对以下 Rust "reqwest" 代码的理解是否正确?
Is my understanding of the following Rust "reqwest" code correct?
我一直在研究 Rust 并遇到了以下代码:
fn request(&url) -> Result<(), Box<dyn std::error::Error>> {
let mut res = reqwest::get(&url)?;
let mut body = String::new();
res.read_to_string(&mut body)?;
println!("Status: {}", res.status());
println!("Headers:\n{:#?}", res.headers());
println!("Body:\n{}", body);
Ok(())
}
据我了解:
fn request(&url) -> Result<(), Box<dyn std::error::Error>> {
定义一个具有单个(借用)参数并使用 Result
处理错误的函数。
let mut res = reqwest::get(&url)?;
定义一个可变变量来存储来自 reqwest
crate 的 get
方法的响应 object。
let mut body = String::new();
定义一个可变变量来存储 responseText 字符串。
res.read_to_string(&mut body)?;
此方法将 responseText
存储在 body
变量中。
println!("Status: {}", res.status());
println!("Headers:\n{:#?}", res.headers());
println!("Body:\n{}", body);
打印包含响应状态的三个格式化字符串(尾随新行),headers 和 body.
Ok(())
通过 Result
..?
处理错误
问题:
Result<()
和OK(())
mean/do中的空括号是什么意思?
- 什么是
Box<dyn std::error::Error>
?
你的理解完全正确。
Result 是一个 Enum,它可以是 "Ok" 或 "Err" - 如果 Ok,那么可以有一些 okayness 的值(结果,响应,数据,输出,随便);类似地,如果是 Err,那么您可能想要传达一些具体的错误。让我们分解结果。
应该这样读:Result<TypeOfValueIfOkay, TypeOfErrorWhenNotOkay>
。这两个子类型可以是任何东西,但它们必须是某种东西——不能忽略它。
所以如果 TypeOfValueIfOkay
必须是某物,但如果你不想 return 某物,你可以 return 一个空的 Tuple.那就是结果中的 ()
。它只是有效地说 "I return nothing at all when everything goes well".
那么第二部分 TypeOfErrorWhenNotOkay
也可以是任何类型——字符串、整数等等。它有助于类型实现 std::error::Error
特征,帮助调用者标准化一点。
返回 "some dynamic object but that implements trait std::error::Error
" 需要 Rust 知道这个值的确切大小,如果它是 return 它在调用者的堆栈上(调用者的堆栈需要调整大小以接受它。)
这就是 Box
类型的用武之地——它将实际值推入堆中并保存指向它的指针(无论堆上的实际值如何,它都可以是可预测的固定大小。) <dyn std::error::Error>
保证无论装箱值是什么,它都实现了 Error 特性。
所以现在最后的 Ok(())
是有道理的。如果您阅读 Ok(value)
:它表示结果枚举是变体 Ok
,其值为 "empty tuple" ()
,即什么都没有。
我一直在研究 Rust 并遇到了以下代码:
fn request(&url) -> Result<(), Box<dyn std::error::Error>> {
let mut res = reqwest::get(&url)?;
let mut body = String::new();
res.read_to_string(&mut body)?;
println!("Status: {}", res.status());
println!("Headers:\n{:#?}", res.headers());
println!("Body:\n{}", body);
Ok(())
}
据我了解:
fn request(&url) -> Result<(), Box<dyn std::error::Error>> {
定义一个具有单个(借用)参数并使用 Result
处理错误的函数。
let mut res = reqwest::get(&url)?;
定义一个可变变量来存储来自 reqwest
crate 的 get
方法的响应 object。
let mut body = String::new();
定义一个可变变量来存储 responseText 字符串。
res.read_to_string(&mut body)?;
此方法将 responseText
存储在 body
变量中。
println!("Status: {}", res.status());
println!("Headers:\n{:#?}", res.headers());
println!("Body:\n{}", body);
打印包含响应状态的三个格式化字符串(尾随新行),headers 和 body.
Ok(())
通过 Result
..?
问题:
Result<()
和OK(())
mean/do中的空括号是什么意思?- 什么是
Box<dyn std::error::Error>
?
你的理解完全正确。
Result 是一个 Enum,它可以是 "Ok" 或 "Err" - 如果 Ok,那么可以有一些 okayness 的值(结果,响应,数据,输出,随便);类似地,如果是 Err,那么您可能想要传达一些具体的错误。让我们分解结果。
应该这样读:
Result<TypeOfValueIfOkay, TypeOfErrorWhenNotOkay>
。这两个子类型可以是任何东西,但它们必须是某种东西——不能忽略它。所以如果
TypeOfValueIfOkay
必须是某物,但如果你不想 return 某物,你可以 return 一个空的 Tuple.那就是结果中的()
。它只是有效地说 "I return nothing at all when everything goes well".那么第二部分
TypeOfErrorWhenNotOkay
也可以是任何类型——字符串、整数等等。它有助于类型实现std::error::Error
特征,帮助调用者标准化一点。返回 "some dynamic object but that implements trait
std::error::Error
" 需要 Rust 知道这个值的确切大小,如果它是 return 它在调用者的堆栈上(调用者的堆栈需要调整大小以接受它。)这就是
Box
类型的用武之地——它将实际值推入堆中并保存指向它的指针(无论堆上的实际值如何,它都可以是可预测的固定大小。)<dyn std::error::Error>
保证无论装箱值是什么,它都实现了 Error 特性。所以现在最后的
Ok(())
是有道理的。如果您阅读Ok(value)
:它表示结果枚举是变体Ok
,其值为 "empty tuple"()
,即什么都没有。