我一直在玩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
处理错误。.?
问题:
Result<()
和OK(())
中的空括号是什么意思?Box<dyn std::error::Error>
?您的理解绝对正确。
结果是一个枚举,可以是“ Ok”或“ Err”-如果确定,则可以存在一定的确定性值(结果,响应,数据,输出等);同样,如果是Err,那么您可能想传达一些具体错误。这样,我们就可以分解结果。
应该这样阅读:Result<TypeOfValueIfOkay, TypeOfErrorWhenNotOkay>
。这两个子类型可以是任何东西,但它们必须是某些东西-不能只是忽略它。
因此,如果TypeOfValueIfOkay
必须是某物,但是如果您不想返回某物,则可以返回一个空的Tuple。那就是结果中的()
。这只是在说“一切顺利时,我什么也不会返回”。
因此第二部分TypeOfErrorWhenNotOkay
也可以是任何类型-字符串,整数,任意值。它有助于类型实现std::error::Error
特性,以帮助调用者进行标准化。
返回“某个动态对象,但实现特征std::error::Error
”,如果Rust要在调用者的堆栈上返回该值,则Rust必须知道该值的确切大小(调用者的堆栈需要调整大小以接受它。)
这是Box
类型的出现位置-它将实际值压入堆并保持指向它的指针(无论堆上的实际值如何,该指针都可以具有可预测的固定大小。)<dyn std::error::Error>
为确保无论装箱的值是多少,它都会实现Error特性。
所以现在最后的Ok(())
才有意义。如果您阅读Ok(value)
:它表示结果枚举是变量Ok
,其值为“空元组” ()
,即无。