[Rust] 1.95.0 업데이트 발표 (번역)

[원본 링크]

https://blog.rust-lang.org/2026/04/16/Rust-1.95.0/
러스트는 누구든 믿음직하고 효과적인 소프트웨어를 만들 수 있게 도와주는 끝내주는 언어입니다.

만약 rustup을 통해서 Rust의 이전버전을 설치해놓은 상대라면, 업데이트는 아주 쉽습니다. 그냥 이렇게 치면 돼요.

rustup update stable

rustup을 설치한 적이 없다면, 우리 웹사이트의 설치 페이지에서 받을 수 있습니다. 그리고 깃허브에서 이번 버전에 대한 릴리즈 노트를 참조해보세요.

미래의 릴리즈를 테스트해서 러스트 팀을 돕고 싶다면, 로컬에서 베타 채널(rustup default beta) 또는 nightly 채널(rustup default nightly)로 업데이트하는 것을 고려할 수 있습니다.

버그를 발견했다면 리포트해주세요!




1.95.0 stable에는 무엇이 있나요?



cfg_select!

Rust 1.95 버전에서는 컴파일 타임 cfg 조건을 match 문처럼 처리하는 cfg_select! 매크로가 도입되었습니다. 이 매크로는 기존에 널리 사용되던 cfg-if 크레이트와 동일한 목적을 수행하지만, 문법적인 차이가 있습니다.

cfg_select!는 설정 조건(configuration predicate)이 true로 평가되는 첫 번째 분기(arm)의 우측 코드로 확장됩니다.

예를 들면, 이렇습니다.

cfg_select! {
** unix => {**
** fn foo() { / unix specific functionality / }**
** }**
** target_pointer_width = "32" => {**
** fn foo() { / non-unix, 32-bit functionality / }
** }

** _ => {

** fn foo() {
** /* fallback implementation /*** }**
** }**
}


let is_windows_str = cfg_select! {
** windows => "windows",**
** _ => "not windows",**
};




match에서의 if-let guard

Rust 1.88에서 let chain이 stable이 되었죠.
Rust 1.95은 match 표현식에서의 let chain을 가능하게 해줍니다. 이제 패턴 표현식 내에서 match를 쓸 수 있어요.

match value {
** Some(x) if let Ok(y) = compute(x) => {**
** **** // Both x and y are available here******
** println!("{}, {}", x, y);**
** }**
** _ => {}**
}

현재 컴파일러는 if 가드와 마찬가지로, if let 가드에서 매칭된 패턴을 전체 match 표현식의 완전성 검사(exhaustiveness evaluation) 대상으로 고려하지 않는다는 점에 유의하세요.




Stable이 된 API

MaybeUninit<[T; N]>: From<[MaybeUninit; N]>
MaybeUninit<[T; N]>: AsRef<[MaybeUninit; N]>
MaybeUninit<[T; N]>: AsRef<[MaybeUninit]>
MaybeUninit<[T; N]>: AsMut<[MaybeUninit; N]>
MaybeUninit<[T; N]>: AsMut<[MaybeUninit]>
[MaybeUninit; N]: From<MaybeUninit<[T; N]>>
Cell<[T; N]>: AsRef<[Cell; N]>
Cell<[T; N]>: AsRef<[Cell]>
Cell<[T]>: AsRef<[Cell]>
bool: TryFrom<{integer}>
AtomicPtr::update
AtomicPtr::try_update
AtomicBool::update
AtomicBool::try_update
AtomicIn::update
AtomicIn::try_update
AtomicUn::update
AtomicUn::try_update
cfg_select!
mod core::range
core::range::RangeInclusive
core::range::RangeInclusiveIter
core::hint::cold_path
<*const T>::as_ref_unchecked
<*mut T>::as_ref_unchecked
<*mut T>::as_mut_unchecked
Vec::push_mut
Vec::insert_mut
VecDeque::push_front_mut
VecDeque::push_back_mut
VecDeque::insert_mut
LinkedList::push_front_mut
LinkedList::push_back_mut
Layout::dangling_ptr
Layout::repeat
Layout::repeat_packed
Layout::extend_packed

다음의 stable API들은 이제 const context에서도 stable로 사용 가능합니다.

fmt::from_fn
ControlFlow::is_break
ControlFlow::is_continue




Stable에서 JSON target spec 제거

Rust 1.95 버전의 stable에서 rustc에 커스텀 타겟 사양(custom target specification)을 전달하는 기능이 제거되었습니다.
이는 완전히 stable 툴체인만을 사용하는 사용자들에게는 어떠한 영향도 미치지 않을 겁니다. 표준 라이브러리(단순히 core만 포함하는 경우라도)를 직접 빌드하려면 이미 nightly 전용 기능들이 필요했기 때문이죠.

Rust 팀은 이 기능의 특정 형태를 안정화할지 여부를 검토 중이며, 이를 위해 현재 tracking issue에서 커스텀 타겟의 다양한 use cases를 수집하고 있습니다.




기타 변경점

이외의 모든 변경사항은 각 Rust, Cargo, Clippy 페이지를 확인하세요




1.95.0의 컨트리뷰터들에게

1.95.0의 완성엔 수많은 사람들이 함께했습니다. 전부 여러분이 없었다면 불가능했을 거에요.

고마워요!