"루프"를 끝낼 때 "break"에 세미콜론이 필요하지 않은 이유는 무엇입니까?

Nov 26 2020

Rust Book의 3.5 장 에서 발췌 :

... 우리 break는 값과 함께 키워드를 사용합니다 counter * 2. 루프 후 세미콜론을 사용하여 값을에 할당하는 문을 끝냅니다 result.

추가로 코드 스 니펫 :

fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };

    println!("The result is {}", result);
}

나는 이것이 어떻게 작동하는지 그리고 왜 결과가 20인지 이해하지만, "break"키워드를 포함하는 줄에서 세미콜론을 제거하면 프로그램이 동등하다는 것을 알았습니다.

이 경우 세미콜론이 선택 사항 인 이유는 무엇입니까?

답변

5 E_net4thecurator Nov 26 2020 at 22:30

더 짧은 예 :

let _: i32 = loop {
    if true {
        break 3; // ()
    }
};

세미콜론이 의도 한 결과를 방해하지 않는 또 다른 예입니다. 먼저 세미콜론을 삽입하면 단위 유형으로 평가되는 표현식 문이 도입 ()됩니다. 는 AS loops와 if표현이 동일한 유형의 평가 코드 블록을 인정 계속 (), 모든 종류의 적합성에 있습니다.

let _: i32 = loop {
    if true {
        break 3 // !
    }
};

세미콜론이 제거되면 break은 never 유형으로! 평가되어 다른 유형으로 강제 변환됩니다. 이는 외부 범위에서 예상하는 모든 유형을 충족 함을 의미합니다. 따라서 if 블록의 끝에 다른 문을 추가하지 않는 한 모두 동일합니다.

모두 breakreturn로 평가 !부작용이 프로그램은 자연적인 워크 플로우를 통해 이동하지 않을 것이라는 의미로,.

또한보십시오:

  • 반환식이 불필요한 세미콜론을 사용하는 이유는 무엇입니까?
  • Rust에서 return 문을 사용하는 것과 세미콜론을 생략하는 것의 차이점은 무엇입니까?
  • 함수의 끝에 도달 할 수 없다고 정적으로 주장하는 방법
3 pretzelhammer Nov 26 2020 at 22:42

표현식 문 에 대한 Rust 언어 참조 :

표현 문은 식을 평가하고 그 결과를 무시 하나입니다. 일반적으로 표현 문의 목적은 표현을 평가하는 효과를 유발하는 것입니다.

블록 식 또는 제어 흐름 식으로 만 구성된 식은 문이 허용되는 컨텍스트에서 사용되는 경우 후행 세미콜론을 생략 할 수 있습니다 .

거의 모든 것이 Rust의 표현이기 때문에 이것이 순전히 미학과 인체 공학을위한 것이라고 생각합니다. 모든 표현식 뒤에 후행 세미콜론이 필수 였다면 끔찍해 보이는 세미콜론으로 if-else 블록 (표현식이기도 함)을 종료해야합니다.

if {
    // do something
} else {
    // do something else
}; // <- gross

마찬가지로, 제어 흐름을 생성하기 때문에 모든 제어 흐름 식에서 후행 세미콜론을 생략 할 수 있으므로 식의 결과를 버리고 ()대신 평가하는 세미콜론의 일반적인 기능 은 관련이 없습니다.

fn five() -> i32 {
    return 5 // to semicolon or not to semicolon? it doesn't matter
}

위의 예 return 5에서는 제어 흐름을 생성하기 때문에 어쨌든 그 표현식의 결과를 "캡처"할 수 없기 때문에 세미콜론으로 끝나 든 그렇지 않든 차이를 만들지 않습니다. 같은 다른 제어 흐름과 같은 표현에 대한 사실 것 break하고 continue.