【发布时间】:2019-11-23 23:52:36
【问题描述】:
我正在编写一个函数,它在成功(和失败)时返回一个 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 的编译器告诉我“类型不匹配”,它是 expected type (),但 found type 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? 的答案。
标签: rust return serde-json