[Rust] 1.53.0 업데이트 발표 (번역)
https://blog.rust-lang.org/2021/06/17/Rust-1.53.0.html
우리 러스트 팀은 새 버전 [1.53.0]을 발표하게 돼서 정말 기쁩니다!
러스트는 누구든 믿음직하고 효과적인 소프트웨어를 만들 수 있게 도와주는 끝내주는 언어입니다.
만약 rustup을 통해서 Rust의 이전버전을 설치해놓은 상대라면, 업데이트는 아주 쉽습니다. 그냥 이렇게 치면 돼요.
rustup update stable
rustup을 설치한 적이 없다면, 우리 웹사이트의 설치 페이지에서 받을 수 있습니다. 그리고 깃허브에서 이번 버전에 대한 릴리즈 노트를 참조해보세요.
1.53.0엔 무엇이 있나요?
이번 릴리즈에서는 몇개의 새 언어 기능과 여러가지 라이브러리 기능이 추가됩니다.
배열에 대한 long-awaited IntoIterator 구현 같은거요.
이 포스트에서 다루지 않은 기타 변경사항들은 릴리즈 노트를 참조하세요.
배열의 IntoIterator
이건 배열이 IntoIterator 트레잇을 구현하는 첫번째 릴리즈입니다.
이 말은 이제 배열도 값으로 반복을 수행할 수 있단거죠.
이렇게요.
**for i in [1, 2, 3] { **
** .. **
**} **
예전에는 &[1, 2, 3]나 [1, 2, 3].iter()를 써서 참조를 통해야만 가능했죠.
비슷하게 이제 T: IntoIterator를 기대하는 메서드들에도 배열을 곧장 보내줄 수 있고요
let set = BTreeSet::from_iter([1, 2, 3]);
for (a, b) in some_iterator
.chain([1])
.zip([1, 2, 3]) {
..
}
이건 이전 버전과의 호환성 문제로 구현되지 못했던 부분입니다.
IntoIterator가 이미 배열에 배한 참조로 구현됐고, array.into_iter()가 이미 이전 버전에서 컴파일되어 (&array).into_iter().로 해결됩니다.
이번 릴리즈에서 배열은 코드가 깨지지 않도록 작은 방법을 사용합니다.
컴파일러가 array.into_iter()를 그냥 (&array).into_iter()로 해석해주는거죠.
그러니까 .into_iter() 메서드 호출의 신택스만 적용해준게 다인겁니다. 그리고 어떤 다른 문법요소에도 영향을 주지 않으면서 for e in [1, 2, 3]나 iter.zip([1, 2, 3]), IntoIterator::into_iter([1, 2, 3]) 같은걸 다 잘 컴파일해주는거에요.
.into_iter()에 대한 이 특별한 케이스는 하위호환성 파괴를 피하기 위해서만 필요한지라, 올해 말에 출시 될 새 버전인 Rust 2021에서는 제거되었습니다. 자세한 내용은 에디션 발표를 참조하세요..
Or 패턴
패턴 문법도 확장돼서 |가 아무데나 중첩될수 있게 됐네요.
이제 Some(1) | Some(2) 대신에 Some(1 | 2) 처럼 쓸수 있어요.
**match result { **
** Ok(Some(1 | 2)) => { .. } **
** Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. } **
** _ => { .. } **
**} **
유니코드 식별자
식별자는 아스키 문자 외에도 표현할 수 있게 됩니다.
이제 UAX # 31에 정의된 유니코드의 모든 유효한 식별자 문자를 사용할 수 있습니다.
여기에는 다양한 스크립트 및 언어의 문자들이 포함되지만 이모지는 없습니다.
이제 이렇게 쓸수 있는거에요.
**const BLÅHAJ: &str = "🦈"; **
**struct 人 { **
** 名字: String, **
**} **
**let α = 1; **
컴파일러는 다른 스크립트와 관련된 잠재적으로 혼란스러운 상황에 대해 경고합니다.
컴파일러는 다른 스크립트와 관련된 잠재적으로 혼란스러운 상황에 대해 경고합니다.
예를 들면 매우 유사한 식별자를 사용할 때요.
warning: identifier pair considered confusable between s and s
(대충 비슷하게 생긴 다른문자 헷갈리게 쓰지 말라는 뜻)
Cargo에서 HEAD 브랜치명 지원
Cargo는 더 이상 git 저장소의 기본 HEAD 이름이 master라고 가정하지 않습니다.
즉, 기본 브랜치를 main이라고하는 저장소에서 git 종속성에 대해 더 이상 branch = "main"을 지정할 필요가 없습니다.
증분 컴파일은 기본적으로 꺼져 있습니다.
이전에 버전 1.52.1에 대한 블로그 게시물에서 논의했듯이 stable Rust 릴리즈 채널에서는 증분 컴파일이 기본적으로 꺼져 있습니다.
이 기능은 베타 및 나이틀리 릴리스 채널에서 계속 사용할 수 있습니다.
1.53.0 stable 릴리즈의 경우 증분을 다시 활성화하는 방법이 1.52.1에서 변경되지 않았습니다.
Stable이 된 API들
다음 메서드와 트레잇 구현들이 안정화되었습니다.
array::from_ref
array::from_mut
AtomicBool::fetch_update
AtomicPtr::fetch_update
BTreeSet::retain
BTreeMap::retain
BufReader::seek_relative
cmp::min_by
cmp::min_by_key
cmp::max_by
cmp::max_by_key
DebugStruct::finish_non_exhaustive
Duration::ZERO
Duration::MAX
Duration::is_zero
Duration::saturating_add
Duration::saturating_sub
Duration::saturating_mul
f32::is_subnormal
f64::is_subnormal
IntoIterator for array
{integer}::BITS
io::Error::Unsupported
NonZero*::leading_zeros
NonZero*::trailing_zeros
Option::insert
Ordering::is_eq
Ordering::is_ne
Ordering::is_lt
Ordering::is_gt
Ordering::is_le
Ordering::is_ge
OsStr::make_ascii_lowercase
OsStr::make_ascii_uppercase
OsStr::to_ascii_lowercase
OsStr::to_ascii_uppercase
OsStr::is_ascii
OsStr::eq_ignore_ascii_case
Peekable::peek_mut
Rc::increment_strong_count
Rc::decrement_strong_count
slice::IterMut::as_slice
AsRef<[T]> for slice::IterMut
impl SliceIndex for (Bound
Vec::extend_from_within
기타 변경점
1.53 릴리즈에는 이외의 기타 변경점들도 있습니다. Rust, Cargo, Clippy에서 무엇이 바뀌었는지 확인해보세요.
1.53.0의 컨트리뷰터들
1.53의 완성엔 수많은 사람들이 함께했습니다. 전부 여러분이 없었다면 불가능했을 거에요.
고마워요!