我正在编写一个函数,当成功(或失败)时返回serde_json::Value。在 Rust 中,我以前省略了分号来从函数中返回数据,就像下面的代码示例中一样:
通过添加
use serde_json::{Result, Value};
use core::result::Result as ResultCore;
fn returning_function() -> ResultCore<Value, Value> {
let data = r#"
{
"status": "ok",
"response": {
"data": "secret message!"
}
}
"#;
match str_to_json(data) {
Ok(json_data) => match json_data["status"].as_str() {
Some(status_str) => {
if status_str == "ok" {
Ok(json_data["response"].clone())
}
}
None => eprintln!("\"status\" was not a string")
}
Err(error) => eprintln!("something went wrong! here's what: {}", error)
}
Err(serde_json::Value::Null)
}
fn str_to_json(json_data: &str) -> Result<Value> {
Ok(serde_json::from_str(json_data)?)
}
接下来是我不理解的部分:这段代码无法编译。Rust编译器告诉我“类型不匹配”,它期望的类型是()
,但实际上找到的类型是serde_json::value::Value
。现在,我找到了一个可编译的解决方案,如下所示:
use serde_json::{Result, Value};
use core::result::Result as ResultCore;
fn returning_function() -> ResultCore<Value, Value> {
let data = r#"
{
"status": "ok",
"response": {
"data": "secret message!"
}
}
"#;
match str_to_json(data) {
Ok(json_data) => match json_data["status"].as_str() {
Some(status_str) => {
if status_str == "ok" {
return Ok(json_data["response"].clone());
// ^ added return statement here
}
}
None => eprintln!("\"status\" was not a string")
}
Err(error) => eprintln!("something went wrong! here's what: {}", error)
}
Err(serde_json::Value::Null)
}
fn str_to_json(json_data: &str) -> Result<Value> {
Ok(serde_json::from_str(json_data)?)
}
通过添加
return
语句,编译器突然变得满意了,而且编译器再也没有什么可说的了。为什么会这样?我曾经以为省略分号和使用return语句具有相同的含义 - 为什么这里不同呢?
return
语句会从整个函数中返回,而一个代码块的最后一个表达式(如果省略了分号)隐式地只从该代码块中返回。请参阅 What type is the “type ()” in Rust? 中的答案以获取更多讨论。 - SCappella