【问题标题】:Is my understanding of the following Rust "reqwest" code correct?我对以下 Rust“reqwest”代码的理解是否正确?
【发布时间】:2020-04-18 13:26:26
【问题描述】:

我一直在玩 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..处理错误?


问题:

  1. Result&lt;()OK(()) 中的空括号是什么意思?
  2. 什么是Box&lt;dyn std::error::Error&gt;

【问题讨论】:

  • () 既是单位类型又是单位值。 Box 是特征对象。也许有关键字可以搜索。

标签: error-handling rust http-get reqwest


【解决方案1】:

你的理解完全正确。

  1. Result 是一个 Enum,可以是“Ok”或“Err”——如果 Ok,那么可以有一些正常值(结果、响应、数据、输出等);同样,如果 Err,那么您可能想要传达一些具体的错误。有了这个,让我们分解结果。

    应该这样读:Result&lt;TypeOfValueIfOkay, TypeOfErrorWhenNotOkay&gt;。这两种子类型可以是任何东西,但它们必须是某种东西——不能忽略它。

  2. 因此,如果TypeOfValueIfOkay 必须是某物,但如果您不想返回某物,则可以返回一个空的Tuple。那就是结果中的()。它只是有效地说“当一切顺利时我什么都不返回”。

  3. 那么第二部分TypeOfErrorWhenNotOkay 也可以是任何类型——字符串、int 等等。它有助于类型实现 std::error::Error 特征,帮助调用者标准化一点。

    返回“一些动态对象但实现了 trait std::error::Error”需要 Rust 知道这个值的确切大小,如果它要在调用者的堆栈上返回它(调用者的堆栈需要调整大小以接受它。)

    这就是 Box 类型的用武之地——它将实际值推送到堆上并持有一个指向它的指针(无论堆上的实际值如何,它都可以是可预测的固定大小。)&lt;dyn std::error::Error&gt;保证无论装箱的值是什么,它都会实现 Error trait。

  4. 所以现在最后的Ok(()) 是有意义的。如果您阅读 Ok(value):它说 Result 枚举是变体 Ok,其值为“空元组”(),即什么都没有。

【讨论】:

  • 感谢您抽出宝贵时间回答我的问题,非常感谢。另外,欢迎使用 *!
最近更新 更多