러스트는 절대 그렇게 하지 않을 것입니다!

8557 단어 rustprogramming
즉 녹 never type(!)입니다.

모든 것은 표현이다



Rust는 일종의 "모든 것이 표현"유형의 언어입니다. 식은 값을 생성하는 것입니다. 모든 것이 표현식은 아니지만 기본적으로 Rust 본체(실행 코드)에 있는 모든 것은 표현식입니다. 실제로 다음과 같은 지역 주민이 아닌 한 가지는 다음과 같습니다.

let x = 5;


그것은 자신의 진술입니다! 그러나 let 문이 있는 식을 가질 수 있습니다.


if let Some(num) = func_that_returns_option() {}

let 문은 로컬이 아니라 let expression 입니다.

식이기도 한 몇 가지 다른 사항을 살펴보겠습니다.

{ 1 }



loop { break 1; }



if true { 1 } else { return; }


이 마지막 것이 우리가 관심을 가질 것입니다.

절대 유형



그래서 내가 준 마지막 예를 살펴보면 if 블록이 1 로 평가된다는 것을 알 수 있습니다. 그러나 else 블록은 어떻습니까? return;는 값을 생성하지 않고 실제로 함수를 떠납니다. 그래서 그 유형은 무엇입니까?

바로, never 유형입니다!
never 유형의 요점은 "이 계산은 완료되지 않습니다."라고 말하는 것입니다. 그런 식으로 해당 값에 무언가를 할당하면 다음과 같습니다.

let x = if true { 1 } else { return; }

x의 유형은 if 블록을 기반으로 합니다. 그러나 이것이 never 유형이 무시된다는 의미는 아닙니다. 컴파일러가 출력never을 파악하는 방법은 모든 유형으로 강제 변환될 수 있습니다. 즉, x 에 대한 유형을 유추하려고 할 때 컴파일러는 if 블록에 i32 유형이 있음을 확인합니다. 그런 다음 else 블록은 never 유형을 가지므로 일관성을 유지하기 위해 "neveri32로 변환할 수 있습니다"라고 표시되며 모두 괜찮습니다!

이것은 사용자에게 무엇을 의미합니까?



글쎄요. 대부분 재미있는 컴파일러 복잡성입니다. 그러나 진단에서 언급된 것을 보려면 새let else 구문을 사용해 보십시오(현재는 nightly에서만 사용 가능). 이 구문을 사용하면 다음과 같이 항상 참이 아닐 수 있는 바인딩let에 대한 패턴을 사용할 수 있습니다.

let Ok(x) = returns_result() else { warn!("This is bad!"); return; };


따라서 returns_resultOk를 반환하면 x의 값에 Ok를 할당합니다. 그러나 그렇지 않은 경우 경고하고 반환합니다. 아주 쉽습니다!

하지만 그 else 블록의 유형은 never 여야 합니다.

따라서 다음과 같은 최소한의 예를 사용하여 그렇게 하지 않도록 하십시오.

#![feature(let_else)]

fn opt() -> Option<i32> {
    Some(1)
}

fn main() {
    let Some(x) = opt() else { 1 };
}


다음과 같은 오류가 발생합니다.

error[E0308]: `else` clause of `let...else` does not diverge
 --> letelse.rs:7:30
  |
7 |     let Some(x) = opt() else { 1 };
  |                              ^^^^^ expected `!`, found integer
  |
  = note: expected type `!`
             found type `{integer}`
  = help: try adding a diverging expression, such as `return` or `panic!(..)`
  = help: ...or use `match` instead of `let...else`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.

else 블록이 갈라질 것으로 예상하므로 never 유형이어야 합니다!

시원한.

녹은 never 그것에서 돌아올 것입니다.

좋은 웹페이지 즐겨찾기