성공 (및 실패)시 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
이른 반환이라고도 하는 문은 마지막 / 가장 안쪽 함수와 같은 범위에서 개체를 반환합니다. (클로저와 함수 모두에 적용되기 때문에 함수형)
let x = || {
return 0;
println!("This will never happen!");
};
fn foo() {
return 0;
println!("This won't happen either");
}
세미콜론이 없으면 대신 a와 같은 표현식을 평가 return
하지만 마지막 / 가장 안쪽 범위로만 반환됩니다. 즉, 모든 집합 내에서 반환됩니다 {}
.
let x = { // Scope start
0
}; // Scope end
fn foo() -> usize { // Scope start
0
} // Scope end
return
문은 함수와 같은 범위에 도달 할 때까지 중첩 된 범위에서 벗어나게됩니다.
fn foo() -> usize {// <------------------------------------------\
{ // |
{ // |
{ // |
{ // |
{ // |
{ // |
{ // |
{ // |
{ // |
{ // |
{ // |
return 0; // ---/
}
}
}
}
}
}
}
}
}
}
}
}
이 return
명령문에는 자체 유형이 있습니다. 즉, let x = return;
실제로 컴파일됩니다.
반환 문을 평가합니다 !
, AKA (가) 입력되지 않습니다 . 지금은 안정된 녹으로 이름을 붙일 수 없지만 결국 안정되고 사용 가능해질 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다