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

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

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

rustup update stable

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

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

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




1.94.0에는 무엇이 있나요?



Array windows

Rust 1.94 버전에서 slice를 위한 새로운 iterate 메서드 array_windows가 추가되었습니다.
이 메서드는 기존의 windows와 거의 비슷하게 작동하지만, 상수 길이를 가진다는 차이점이 있습니다. 그래서 iterator item의 타입도 &[T]가 아니라 &[T; N]가 되죠.
많은 경우, window의 길이는 iterator가 사용되는 방식에 따라 자동으로 추론되기도 합니다!

예를 들어, 2016년 Advent of Code 퍼즐 중에는 다음과 같은 ABBA 패턴을 찾는 문제가 있었습니다.
"xyyx나 abba처럼, 서로 다른 두 문자가 나오고 그 뒤에 해당 쌍의 역순이 뒤따르는 패턴"이죠.
ASCII 문자만 사용한다고 가정하면, 바이트 슬라이스의 window를 다음과 같이 돌리면서 코드를 작성할 수 있습니다.

fn has_abba(s: &str) -> bool {
** s.as_bytes()**
** .array_windows()**
** .any(|[a1, b1, b2, a2]| (a1 != b1) && (a1 == a2) && (b1 == b2))**
}

해당 클로저에 사용된 destructuring argument 패턴 덕분에, 컴파일러는 우리가 여기서 크기 4의 window를 원한다는 것을 자동으로 추론할 수 있습니다.
만약 이전 방식인 .windows(4) iterator를 사용했다면, 해당 인자는 동적인 슬라이스였을 것이고, 우리는 bound check가 최적화 과정에서 제발 제거되기를 바라며 일일이 수동 배열 인덱싱을 해야 했을 것입니다.




Cargo config inclusion

이제 Cargo는 설정 파일(.cargo/config.toml)에서 include 기능을 지원합니다.
이를 통해 여러 프로젝트와 환경에 걸쳐 Cargo 설정을 더 효율적으로 체계화하고, 재사용할 수 있게 되었습니다.
또한, 파일이 존재하지 않을 수도 있는 상황일 때는 이 include 경로들을 optional로 표시할 수도 있습니다.

# array of paths
include = [
** "frodo.toml",**
** "samwise.toml",**
]


# inline tables for more control
include = [
** { path = "required.toml" },**
** { path = "optional.toml", optional = true },**
]

이에 대한 자세한 내용은 문서를 참조하세요.




Cargo에서 TOML 1.1 지원

이제 Cargo가 Cargo.toml와 설정 파일들에 대해 TOML v1.1 파싱을 지원합니다.
자세한 변경 사항은 TOML 릴리스 노트를 확인하시기 바랍니다.

주요 내용은 다음과 같습니다.

  1. 여러 줄에 걸친 인라인 테이블 및 후행 쉼표(trailing commas) 지원
  2. \xHH 및 \e 문자열 이스케이프 시퀀스 추가
  3. 시간 표기 시 초 단위 생략 가능 (0으로 설정됨)

예를 들어, 기존의 의존성 선언 방식:
serde = { version = "1.0", features = ["derive"] }

...을 이제는 다음과 같이 작성할 수 있습니다:

serde = {
** version = "1.0",**
** features = ["derive"],**
}

주의할 점도 있습니다.
Cargo.toml에 이러한 최신 문법을 사용하면 새로운 Cargo 파서가 필요해지므로 프로젝트의 최소 Rust 버전(MSRV)이 높아진다는 겁니다. manifest를 읽는 서드파티 도구들도 파서를 업데이트해야 할 수 있고요.

하지만 Cargo는 publish 시점에 이전 버전 파서와 호환되도록 manifest를 자동으로 재작성하므로, crate 사용자들을 위해 낮은 MSRV를 유지하는 것은 여전히 가능합니다.




Stable이 된 API

<[T]>::array_windows
<[T]>::element_offset
LazyCell::get
LazyCell::get_mut
LazyCell::force_mut
LazyLock::get
LazyLock::get_mut
LazyLock::force_mut
impl TryFrom for usize
std::iter::Peekable::next_if_map
std::iter::Peekable::next_if_map_mut
x86 avx512fp16 intrinsics (unstable F16 type에 직접 의존하는 것 제외)
AArch64 NEON fp16 intrinsics (unstable F16 type에 직접 의존하는 것 제외)
f32::consts::EULER_GAMMA
f64::consts::EULER_GAMMA
f32::consts::GOLDEN_RATIO
f64::consts::GOLDEN_RATIO

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

f32::mul_add
f64::mul_add




기타 변경점

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




1.94.0의 컨트리뷰터들에게

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

고마워요!