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

时间:2020-04-18 13:26:26

标签: error-handling rust http-get reqwest

我一直在玩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板条箱的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<()OK(())中的空括号是什么意思?
  2. 什么是Box<dyn std::error::Error>

1 个答案:

答案 0 :(得分:2)

您的理解绝对正确。

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

    应该这样阅读:Result<TypeOfValueIfOkay, TypeOfErrorWhenNotOkay>。这两个子类型可以是任何东西,但必须是某些东西-不能只是忽略它。

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

  3. 因此,第二部分TypeOfErrorWhenNotOkay也可以是任何类型-字符串,整数,任意形式。它有助于类型实现std::error::Error特质,以帮助调用者进行标准化。

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

    这是Box类型的用处-它将实际值压入堆并保持指向该堆的指针(无论堆上的实际值如何,该指针的大小都可以是可预测的固定大小。) {1}}可以保证无论装箱的值是多少,它都可以实现Error特征。

  4. 因此,现在最后一个<dyn std::error::Error>才有意义。如果您阅读Ok(()):它表示结果枚举是变量Ok(value)的值,其值为“空元组” Ok,即为空。