[Rust] 1.55.0 업데이트 발표 (번역)
https://blog.rust-lang.org/2021/09/09/Rust-1.55.0.html
우리 러스트 팀은 새 버전 [1.55.0]을 발표하게 돼서 정말 기쁩니다!
러스트는 누구든 믿음직하고 효과적인 소프트웨어를 만들 수 있게 도와주는 끝내주는 언어입니다.
만약 rustup을 통해서 Rust의 이전버전을 설치해놓은 상대라면, 업데이트는 아주 쉽습니다. 그냥 이렇게 치면 돼요.
rustup update stable
rustup을 설치한 적이 없다면, 우리 웹사이트의 설치 페이지에서 받을 수 있습니다. 그리고 깃허브에서 이번 버전에 대한 릴리즈 노트를 참조해보세요.
1.55.0엔 무엇이 있나요?
(공란)
Cargo가 컴파일러 오류를 중복제거
이전 릴리즈에서는 cargo test, cargo check --all-targets 또는 여러 구성에서 동일한 Rust crate를 빌드한 유사한 명령을 실행할 때, rustc가 병렬로 실행되고 각각 다 표시를 해서 오류나 경고가 중복으로 표시될 수 있었습니다.
예를 들어 1.54에서는 다음과 같은 출력이 일반적입니다.
$ cargo +1.54.0 check --all-targets Checking foo v0.1.0
warning: function is never used: foo
--> src/lib.rs:9:4
|ㅤ
9 | fn foo() {}
| ^^^
|
= note: #[warn(dead_code)] on by default
warning: 1 warning emitted
warning: function is never used: foo
--> src/lib.rs:9:4
|
9 | fn foo() {}
| ^^^
|
= note: #[warn(dead_code)] on by default
warning: 1 warning emitted
Finished dev [unoptimized + debuginfo] target(s) in 0.10s
1.55에서, 이 동작은 이제 중복을 제거하고 컴파일이 끝날 때 report를 출력하도록 조정되었습니다.
$ cargo +1.55.0 check --all-targets
Checking foo v0.1.0
warning: function is never used: foo
--> src/lib.rs:9:4
|
9 | fn foo() {}
| ^^^
|
= note: #[warn(dead_code)] on by default
warning: foo (lib) generated 1 warning
warning: foo (lib test) generated 1 warning (1 duplicate)
Finished dev [unoptimized + debuginfo] target(s) in 0.84s
더 빠르고 정확한 float 파싱
표준 라이브러리의 float 파싱 구현이 Eisel-Lemire 알고리즘을 사용하도록 업데이트되어 속도 향상과 정확성 향상을 모두 제공합니다.
과거에는 특정 엣지 케이스가 구문 분석에 실패했지만 지금은 수정되었습니다.
pull request의 설명에서 새로운 구현에 대한 자세한 내용을 읽을 수 있습니다.
std::io::ErrorKind variants 수정
std::io::ErrorKind는 오류를 NotFound 또는 WouldBlock과 같은 이동 가능한 카테고리로 분류하는 #[non_exhaustive] variants입니다.
std::io::Error가 있는 Rust 코드는 kind 메서드를 호출하여 std::io::ErrorKind를 얻고 매칭시켜 특정 오류를 처리할 수 있습니다.
하지만 모든 오류가 ErrorKind 값으로 분류되는 것은 아닙니다. 일부는 분류되지 않고 catch-all variants에 배치됩니다.
이전 버전의 Rust에서는 분류되지 않은 오류가 ErrorKind::Other를 사용했습니다. 그러나 사용자가 만든 std::io::Error 값도 일반적으로 ErrorKind::Other에 사용됩니다.
1.55에서 분류되지 않은 오류는 이제 내부 variants인 ErrorKind::Uncategorized를 사용합니다.
이 variants는 숨겨진 상태로 남겨질 것이고, stable Rust 코드에서 명시적으로 이름을 지정하는 데 사용할 수 없습니다.
그러면 표준 라이브러리에서 제공되지 않는 std::io::Error 값을 구성하기 위해 ErrorKind::Other가 배타적으로 남게 됩니다. 이렇게 하면 ErrorKind의 #[non_exhaustive] 속성이 적용됩니다.
Rust 코드는 ErrorKind::Other와 match해서는 안 되며 특정 기본 오류 코드를 예상해야 합니다.
해당 오류 kind를 사용하는 구성된 std::io::Error를 포착하는 경우에만 ErrorKind::Other와 match합니다.
std::io::Error에 대한 Rust 코드 match는 항상 알지 못하는 오류 종류에 대해 _를 사용해야 합니다. 이 경우 기본 오류 코드와 일치하면 오류를 보고하거나 호출 코드로 버블링할 수 있습니다.
앞으로 새로운 ErrorKind 을 도입하는 방법을 원활하게 하기 위해 우리는 이 변경을 수행하고 있습니다.
이러한 새로운 variants는 nightly에서만 시작되며 나중에 안정화됩니다.
이 변경으로 인해 코드 match variants에 대해 알지 못하는 전체 패턴 _을 사용해야 합니다. 이 패턴은 ErrorKind::Uncategorized과 향후 nightly variants에서 모두 작동합니다.
오픈 범위 패턴 추가
Rust 1.55는 패턴에서의 오픈 범위를 stable로 올립니다.
**match x as u32 { **
** 0 => println!("zero!"), **
** 1.. => println!("positive number!"), **
**} **
더 자세한건 여기에서
Stable이 된 API들
다음 메서드와 트레잇 구현들이 stable이 되었습니다.
Bound::cloned
Drain::as_str
IntoInnerError::into_error
IntoInnerError::into_parts
MaybeUninit::assume_init_mut
MaybeUninit::assume_init_ref
MaybeUninit::write
array::map
ops::ControlFlow
x86::_bittest
x86::_bittestandcomplement
x86::_bittestandreset
x86::_bittestandset
x86_64::_bittest64
x86_64::_bittestandcomplement64
x86_64::_bittestandreset64
x86_64::_bittestandset64
다음의 기존 stable 함수들은 이제 const입니다!
str::from_utf8_unchecked
기타 변경점
1.55 릴리즈에는 이외의 기타 변경점들도 있습니다. Rust, Cargo, Clippy에서 무엇이 바뀌었는지 확인해보세요.
1.55.0의 컨트리뷰터들
1.55의 완성엔 수많은 사람들이 함께했습니다. 전부 여러분이 없었다면 불가능했을 거에요.
고마워요!
헌사
Anna Harren은 커뮤니티의 구성원이자 ::<> 구문을 설명하기 위해 "Turbofish"라는 용어를 만든 것으로 알려진 Rust의 기여자입니다.
Anna는 최근 암 투병 끝에 세상을 떠났습니다.
그녀의 공헌은 영원히 기억되고 언어의 일부가 될 것이며, 우리는 이 릴리즈를 그녀의 기억에 바칩니다.