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

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

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

rustup update stable

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

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

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



1.73.0 stable에는 무엇이 있나요?



더 깔끔해진 panic 메세지

기본 패닉 핸들러에서 생성된 출력이 패닉 메시지를 따옴표로 묶는 대신, 자체 라인에 넣도록 변경되었습니다.
이렇게 하면 다음 예제와 같이 패닉 메시지를 더 쉽게 읽을 수 있습니다.

fn main() {
** let file = "ferris.txt";**
** panic!("oh no! {file:?} not found!");**
}

Rust 1.73 이전의 출력
thread 'main' panicked at 'oh no! "ferris.txt" not found!', src/main.rs:3:5

Rust 1.73 부터의 출력
thread 'main' panicked at src/main.rs:3:5:
oh no! "ferris.txt" not found!

이는 메시지가 길거나, 중첩된 따옴표를 포함하거나, 여러 줄에 걸쳐 있을 때 특히 유용합니다.

또한, 아래와 같이 assert_eq 및 assert_ne에 의해 생성된 패닉 메시지가 수정되어서, 사용자 정의 메시지(세 번째 인자)가 이동되고 일부 불필요한 구두점이 제거되었습니다.

fn main() {
** assert_eq!("🦀", "🐟", "ferris is not a fish");**
}

1.73 이전의 출력
thread 'main' panicked at 'assertion failed: (left == right)
** left: "🦀",**
right: "🐟": ferris is not a fish', src/main.rs:2:5

Rust 1.73의 출력
thread 'main' panicked at src/main.rs:2:5:
assertion left == right failed: ferris is not a fish
** left: "🦀"**
right: "🐟"




Thread local initialization

RFC 3184에서 제안된 대로 LocalKey<Cell> 및 LocalKey<RefCell>는 이제 get(), set(), take() 및 replacement() 메서드를 사용하여 직접 조작할 수 있습니다. 일반적인 LocalKey 작업에는 필요에 따라 with(|inner| ...) 클로저를 사용하세요.

LocalKey는 thread_local! static의 타입입니다.

이 새로운 메서드는 common 코드를 더욱 간결하게 만들고, 새로운 스레드의 경우에는 thread_local!에 지정된 디폴트값에 대해 추가적인 초기화 코드를 실행하지 않도록 해줍니다.

thread_local! {
** static THINGS: Cell<Vec> = Cell::new(Vec::new());**
}


fn f() {
** **** // before:******
** THINGS.with(|i| i.set(vec![1, 2, 3]));**
** // now:**
** THINGS.set(vec![1, 2, 3]);**


** **** // ...******


** // before:**
** let v = THINGS.with(|i| i.take());**
** **** // now:******
** let v: Vec = THINGS.take();**
}




Stable이 된 API

Unsigned {integer}::div_ceil
Unsigned {integer}::next_multiple_of
Unsigned {integer}::checked_next_multiple_of
std::ffi::FromBytesUntilNulError
std::os::unix::fs::chown
std::os::unix::fs::fchown
std::os::unix::fs::lchown
LocalKey::<Cell>::get
LocalKey::<Cell>::set
LocalKey::<Cell>::take
LocalKey::<Cell>::replace
LocalKey::<RefCell>::with_borrow
LocalKey::<RefCell>::with_borrow_mut
LocalKey::<RefCell>::set
LocalKey::<RefCell>::take
LocalKey::<RefCell>::replace

아래 API들은 이제 const context에서도 stable입니다.

rc::Weak::new
sync::Weak::new
NonNull::as_ref




기타 변경점

이외의 모든 변경사항은 각각 Rust, Cargo, Clippy에서 확인하세요.




1.73.0의 컨트리뷰터들에게

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

고마워요!