Rust의 never 타입 `!`, 10년 만에 안정화

1 week ago 9

값이 절대 만들어지지 않는 상황을 나타내는 Rust의 never 타입 ! 가 10년간 다섯 차례의 시도 끝에 안정화됨 !는 panic!(), 무한 루프, 프로세스 종료처럼 호출자에게 값을 반환하지 않는 코드를 타입으로 정확하게 표현함 안정화를 어렵게 만든 핵심은 타입을 추론할 수 없을 때 !를 ()로 처리하던 기존 fallback 동작과 하위 호환성 문제였음 최종 PR은 모든 에디션의 fallback을 !로 통일하고 std::convert::Infallible을 !의 별칭으로 변경함 구현 PR이 Rust 저장소에 병합되어 nightly에 반영됐으며 Rust 1.100.0 안정 버전에 포함될 예정 10년에 걸친 안정화 never 타입은 약 10년 동안 unstable 기능으로 남아 있었으며, 이전의 다섯 차례 안정화 시도가 완료되지 못함 최종 안정화 작업에는 2년 이상이 소요됐고, 타입 추론과 기존 코드의 호환성 문제를 해결하기 위한 변경이 함께 진행됨 개념 자체는 단순하지만 제네릭, trait 선택, 타입 강제 변환과 공개 API에 영향을 주기 때문에 문법만 안정화하는 것으로 끝낼 수 없었음 최종 구현은 rust-lang/rust PR #155499에 포함됐으며 Rust 1.100.0 마일스톤으로 지정됨 never 타입 !란 !는 가능한 값이 하나도 없는 타입으로, 실행이 정상적으로 다음 단계까지 이어지지 않는 코드를 표현함 panic!()을 호출하는 코드 종료되지 않는 loop {} 프로세스를 종료하는 함수 return, break, continue처럼 현재 실행 흐름을 벗어나는 표현식 반환하지 않는 함수는 fn exit() -> !처럼 선언할 수 있어, 값 없이 정상적으로 반환하는 () 함수와 구분됨 실행이 계속되지 않아 실제 값을 만들지 않으므로, !는 주변 문맥에서 요구하는 다른 타입으로 변환될 수 있음 let value: u32 = if valid { 42 } else { panic!() };에서 panic!() 분기는 값을 반환하지 않지만 전체 표현식은 u32가 됨 실패가 불가능한 연산을 Result<T, !>로 나타내면 오류값이 만들어질 수 없다는 사실도 타입에 담을 수 있음 안정화를 막았던 fallback 문제 !가 다른 타입으로 변환돼야 하지만 주변 문맥만으로 목표 타입을 결정할 수 없는 경우 컴파일러에는 별도의 fallback 규칙이 필요함 Rust는 기존 코드와의 호환성을 위...

Read Entire Article