Rust에서 return 문을 사용하는 것과 세미콜론을 생략하는 것의 차이점은 무엇입니까?

뉴 바이트

성공 (및 실패)시 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

메서드의 반환 값을 사용하는 것과 떠나는 것의 차이점은 무엇입니까?

분류에서Dev

PLSQL에서 'execute'를 사용하여 쿼리 문을 실행하는 것과 Directy를 사용하는 것의 차이점은 무엇입니까?

분류에서Dev

문자열을 파일에 에코하는 것과 붙여 넣는 것의 차이점은 무엇입니까?

분류에서Dev

ReST를 사용하는 것과 Sphinx로 문서를 작성하기 위해 HTML을 사용하는 것의 차이점은 무엇입니까?

분류에서Dev

vuejs에서 vue $ nextTick과 setTimeout 0을 사용하는 것의 차이점은 무엇입니까?

분류에서Dev

유닛을 사용하는 것과 사용하지 않는 것의 차이점은 무엇입니까?

분류에서Dev

@ Html.DisplayFor를 사용하는 것과 @Model을 사용하는 것의 차이점은 무엇입니까?

분류에서Dev

Kotlin을 사용한 springboot 테스트에서 @Autowired Constructor를 사용하는 것과 사용하지 않는 것의 차이점은 무엇입니까?

분류에서Dev

HTTP 요청에 netcat (nc)과 curl을 사용하는 것의 차이점은 무엇입니까?

분류에서Dev

is-operator를 사용하는 것과 Dart에서 런타임 유형을 사용하는 것의 차이점은 무엇입니까?

분류에서Dev

kfold, fit, score에서 점수 값을 얻는 것과 cross_val_score를 사용하는 것의 차이점은 무엇입니까?

분류에서Dev

서브 쉘에서 실행하는 것과 & 대 coproc 명령을 사용하는 것의 차이점은 무엇입니까?

분류에서Dev

tmux / screen을 사용하는 멀티플렉싱과 터미널 에뮬레이터에서 탭을 여는 것의 차이점은 무엇입니까?

분류에서Dev

onclick react에서 함수 이름을 전달하는 것과 콜백을 통해 호출하는 것의 차이점은 무엇입니까?

분류에서Dev

Rails 4에서 ActiveModel과 ActiveModel :: Model을 포함하는 것의 차이점은 무엇입니까?

분류에서Dev

@powershell과 powershell (앞에 @이있는 명령)을 실행하는 것의 차이점은 무엇입니까?

분류에서Dev

Rust에서 참조 투명성을 위해 이동 의미론이 의미하는 것은 무엇입니까?

분류에서Dev

Chisel에서 UInt, SInt Bits 유형을 사용하는 것의 차이점은 무엇입니까?

분류에서Dev

함수 핸들을 사용하여 함수를 생성하는 것과 syms를 선언하는 것의 차이점은 무엇입니까?

분류에서Dev

C #에서 틱을 사용하여 두 날짜를 비교하는 것과있는 그대로의 차이점은 무엇입니까

분류에서Dev

html5 삽입 된 동영상을 사용하는 것과 YouTube 링크가있는 iframe을 사용하는 것의 차이점은 무엇입니까?

분류에서Dev

MIME 유형을 지정하는 것과 지정하지 않는 것의 차이점은 무엇입니까?

분류에서Dev

링크 속성을 사용하는 것과 사전 링크 및 사후 링크로 컴파일을 사용하는 것의 차이점은 무엇입니까?

분류에서Dev

DISM을 사용하면 이미지를 캡처하는 것과 오프라인으로 수정하는 것의 차이점은 무엇입니까?

분류에서Dev

Bash의 문자열 변수에서 ~가있는 것과 ~가없는 것의 차이점은 무엇입니까?

분류에서Dev

배열을 정의하기 위해`New` 키워드를 사용하는 것과 사용하지 않는 것의 차이점은 무엇입니까?

분류에서Dev

데이터 프레임 열의 값을 반복하는 것과 열의 데이터에 변수를 할당하는 것의 차이점은 무엇입니까?

분류에서Dev

배열을 함수에 전달하는 것과 main 내부에서 배열을 선언하는 것의 차이점은 무엇입니까?

분류에서Dev

선언 된 배열에 값을 할당하는 것과 C #에서 배열을 만들고 초기화하는 것의 차이점은 무엇입니까?

Related 관련 기사

  1. 1

    메서드의 반환 값을 사용하는 것과 떠나는 것의 차이점은 무엇입니까?

  2. 2

    PLSQL에서 'execute'를 사용하여 쿼리 문을 실행하는 것과 Directy를 사용하는 것의 차이점은 무엇입니까?

  3. 3

    문자열을 파일에 에코하는 것과 붙여 넣는 것의 차이점은 무엇입니까?

  4. 4

    ReST를 사용하는 것과 Sphinx로 문서를 작성하기 위해 HTML을 사용하는 것의 차이점은 무엇입니까?

  5. 5

    vuejs에서 vue $ nextTick과 setTimeout 0을 사용하는 것의 차이점은 무엇입니까?

  6. 6

    유닛을 사용하는 것과 사용하지 않는 것의 차이점은 무엇입니까?

  7. 7

    @ Html.DisplayFor를 사용하는 것과 @Model을 사용하는 것의 차이점은 무엇입니까?

  8. 8

    Kotlin을 사용한 springboot 테스트에서 @Autowired Constructor를 사용하는 것과 사용하지 않는 것의 차이점은 무엇입니까?

  9. 9

    HTTP 요청에 netcat (nc)과 curl을 사용하는 것의 차이점은 무엇입니까?

  10. 10

    is-operator를 사용하는 것과 Dart에서 런타임 유형을 사용하는 것의 차이점은 무엇입니까?

  11. 11

    kfold, fit, score에서 점수 값을 얻는 것과 cross_val_score를 사용하는 것의 차이점은 무엇입니까?

  12. 12

    서브 쉘에서 실행하는 것과 & 대 coproc 명령을 사용하는 것의 차이점은 무엇입니까?

  13. 13

    tmux / screen을 사용하는 멀티플렉싱과 터미널 에뮬레이터에서 탭을 여는 것의 차이점은 무엇입니까?

  14. 14

    onclick react에서 함수 이름을 전달하는 것과 콜백을 통해 호출하는 것의 차이점은 무엇입니까?

  15. 15

    Rails 4에서 ActiveModel과 ActiveModel :: Model을 포함하는 것의 차이점은 무엇입니까?

  16. 16

    @powershell과 powershell (앞에 @이있는 명령)을 실행하는 것의 차이점은 무엇입니까?

  17. 17

    Rust에서 참조 투명성을 위해 이동 의미론이 의미하는 것은 무엇입니까?

  18. 18

    Chisel에서 UInt, SInt Bits 유형을 사용하는 것의 차이점은 무엇입니까?

  19. 19

    함수 핸들을 사용하여 함수를 생성하는 것과 syms를 선언하는 것의 차이점은 무엇입니까?

  20. 20

    C #에서 틱을 사용하여 두 날짜를 비교하는 것과있는 그대로의 차이점은 무엇입니까

  21. 21

    html5 삽입 된 동영상을 사용하는 것과 YouTube 링크가있는 iframe을 사용하는 것의 차이점은 무엇입니까?

  22. 22

    MIME 유형을 지정하는 것과 지정하지 않는 것의 차이점은 무엇입니까?

  23. 23

    링크 속성을 사용하는 것과 사전 링크 및 사후 링크로 컴파일을 사용하는 것의 차이점은 무엇입니까?

  24. 24

    DISM을 사용하면 이미지를 캡처하는 것과 오프라인으로 수정하는 것의 차이점은 무엇입니까?

  25. 25

    Bash의 문자열 변수에서 ~가있는 것과 ~가없는 것의 차이점은 무엇입니까?

  26. 26

    배열을 정의하기 위해`New` 키워드를 사용하는 것과 사용하지 않는 것의 차이점은 무엇입니까?

  27. 27

    데이터 프레임 열의 값을 반복하는 것과 열의 데이터에 변수를 할당하는 것의 차이점은 무엇입니까?

  28. 28

    배열을 함수에 전달하는 것과 main 내부에서 배열을 선언하는 것의 차이점은 무엇입니까?

  29. 29

    선언 된 배열에 값을 할당하는 것과 C #에서 배열을 만들고 초기화하는 것의 차이점은 무엇입니까?

뜨겁다태그

보관