gpt4 book ai didi

error-handling - 我对以下Rust “reqwest”代码的理解正确吗?

转载 作者:行者123 更新时间:2023-12-03 08:09:36 25 4
gpt4 key购买 nike

我一直在研究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方法中的响应对象。
  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);

打印三个格式化的字符串(带有尾随新行),其中包含响应状态,标题和正文。
  Ok(())

通过 Result处理错误。

问题:
  • Result<()OK(())中的空括号是什么意思/做什么?
  • 什么是Box<dyn std::error::Error>
  • 最佳答案

    您的理解绝对正确。

  • 结果是一个枚举,可以为“Ok”或“Err”-如果为Ok,则可以存在一些okayness值(结果,响应,数据,输出等);同样,如果是Err,那么您可能想传达一些具体错误。这样,我们就可以分解结果。

    的内容应如下所示:Result<TypeOfValueIfOkay, TypeOfErrorWhenNotOkay>。这两个子类型可以是任何东西,但它们必须是某些东西-不能仅仅忽略它。
  • 因此,如果TypeOfValueIfOkay必须是某物,但是如果您不想返回某物,则可以返回一个空的Tuple。那就是Result中的()。这只是在说“一切顺利时,我什么也不会返回”。
  • 因此,第二部分TypeOfErrorWhenNotOkay也可以是任何类型-字符串,整数,任意形式。它有助于该类型实现std::error::Error特性,以帮助调用者进行标准化。

    返回“某个动态对象但实现了特征std::error::Error的动态对象”,如果Rust要在调用者的堆栈上返回该值,则Rust必须知道该值的确切大小(调用者的堆栈需要调整大小才能接受它。)

    这就是Box类型出现的地方-它将实际值压入堆并保持指向该堆的指针(无论堆上的实际值如何,该指针的大小都可以是可预测的固定大小。)<dyn std::error::Error>可以确保无论是否装箱值是,它实现Error特征。
  • 所以现在最后的Ok(())有意义了。如果您阅读Ok(value):它说结果枚举是变体Ok,其值为“empty tuple” (),即为空。
  • 关于error-handling - 我对以下Rust “reqwest”代码的理解正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61289885/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com