[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 릴리즈에는 이외의 기타 변경점들도 있습니다. RustCargoClippy에서 무엇이 바뀌었는지 확인해보세요.




1.55.0의 컨트리뷰터들

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




헌사

Anna Harren은 커뮤니티의 구성원이자 ::<> 구문을 설명하기 위해 "Turbofish"라는 용어를 만든 것으로 알려진 Rust의 기여자입니다.
Anna는 최근 암 투병 끝에 세상을 떠났습니다.
그녀의 공헌은 영원히 기억되고 언어의 일부가 될 것이며, 우리는 이 릴리즈를 그녀의 기억에 바칩니다.