러스트는 절대 그렇게 하지 않을 것입니다!
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
유형을 가지므로 일관성을 유지하기 위해 "never
는 i32
로 변환할 수 있습니다"라고 표시되며 모두 괜찮습니다!이것은 사용자에게 무엇을 의미합니까?
글쎄요. 대부분 재미있는 컴파일러 복잡성입니다. 그러나 진단에서 언급된 것을 보려면 새
let else
구문을 사용해 보십시오(현재는 nightly에서만 사용 가능). 이 구문을 사용하면 다음과 같이 항상 참이 아닐 수 있는 바인딩let
에 대한 패턴을 사용할 수 있습니다.let Ok(x) = returns_result() else { warn!("This is bad!"); return; };
따라서
returns_result
가 Ok
를 반환하면 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
그것에서 돌아올 것입니다.
Reference
이 문제에 관하여(러스트는 절대 그렇게 하지 않을 것입니다!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/evantypanski/rust-will-never-do-that-216c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)