[Rust] 1.50.0 업데이트 발표 (번역)
https://blog.rust-lang.org/2021/02/11/Rust-1.50.0.html
우리 러스트 팀은 새 버전 [1.50.0]을 발표하게 돼서 정말 기쁩니다!
러스트는 누구든 믿음직하고 효과적인 소프트웨어를 만들 수 있게 도와주는 끝내주는 언어입니다.
만약 rustup을 통해서 Rust의 이전버전을 설치해놓은 상대라면, 업데이트는 아주 쉽습니다. 그냥 이렇게 치면 돼요.
rustup update stable
rustup을 설치한 적이 없다면, 우리 웹사이트의 설치 페이지에서 받을 수 있습니다. 그리고 깃허브에서 이번 버전에 대한 릴리즈 노트를 참조해보세요.
1.50.0엔 무엇이 있나요?
이번 릴리즈엔 새 타겟들의 추가와 테스트 프레임워크의 개선점이 돋보입니다.
본 포스트에서 다루지 않은 기타 변경점들은 상세 릴리즈 노트를 참고하세요.
이번 릴리즈에는 개선된 어레이 인덱싱, union 필드의 안전한 접근 확장, 표준 라이브러리 추가 등이 있습니다.
이 포스트에서 다루지 않은 기타 변경점에 대한 자세한 사항들은 릴리즈 노트를 참고하세요.
Const-generic array indexing
이 릴리즈부터는 const N 길이의 모든 배열에 대해 ops::Index와 IndexMut 구현이 추가됩니다. array[T; N] 구조에서 말이죠
인덱싱 연산자 []는 이미 빌트인 컴파일러 매-직을 통해 배열에 동작하지만, 타입레벨에서 배열들이 실제로 라이브러리 트레잇들을 구현한건 아니었거든요.
**fn second
**where **
** C: std::ops::Index
**{ **
** &container[1] **
**} **
**fn main() **
**{ **
** let array: [i32; 3] = [1, 2, 3]; **
** assert_eq!(second(&array[..]), &2); **
** ****// 이전엔 슬라이스에만 동작했고 ******
** assert_eq!(second(&array), &2); **
** **** // 이젠 바로도 동작하죠.******
**} **
배열에 대한 const 값 반복
Rust의 배열은 [a, b, c]나 [x; N]의 형태로 작성될 수 있죠.
여기서 길이 N이 1보다 큰 경우 Copy인 x들에 대해서만 반복이 허용되었으며, RFC 2203은 모든 상수 표현식을 허용해야 했습니다.
그러나 이 기능은 임의의 표현식에 대해 unstable했는데요. Rust 1.38부터 실수로 배열 반복에서 const 값의 stable 사용을 허용했었습니다.
fn main() **
{ **
** **** // 이건 허용되지 않습니다.**
** // Option<Vec<i32>> 가 Copy를 구현하지 않기 때문이죠.**
** let array: [Option<Vec
** const NONE: Option<Vec
** const EMPTY: Option<Vec
** **** // 하지만, const 값은 반복이 허용돼요!******
** let nones = [NONE; 10]; **
** let empties = [EMPTY; 10]; **
**} **
1.50에선 이러한 stable화가 공식적으로 인정됩니다.
향후엔 이런 임시로 이름붙인 상수를 사용하지 않고 RFC 2920에 따라 인라인 상수식을 사용할 수 있을 거에요.
ManuallyDrop union 필드의 안전한 할당
Rust 1.49는 union에 대한 Drop을 허용했기에, union에 ManuallyDrop
그러나 union들은 이전에 어떤 variant가 유효했는지 알지 못하기 때문에, 필드가 할당될 때 이전 값을 삭제하지 않습니다.
따라서 safe Rust는 이전에 절대 Drop하지 않는 Copy 타입으로만 제한됐습니다.
물론, ManuallyDrop
유닉스 플랫폼에서 File에 대한 틈새(niche)
Rust의 일부 타입은 유효한 값으로 고려하는 것에 대한 특정 제한이 있으며, 가능한 메모리 값의 전체 범위를 포함하지 않을 수 있습니다.
남아있는 잘못된 값을 틈새(niche)라고 부르며 이 공간은 타입 레이아웃 최적화에 사용될 수 있어요.
예를 들어 Rust 1.28에서는 0이 niche인 NonZero 정수 타입(NonZeroU8 등)을 도입했으며, 이를 통해 Option
Unix 플랫폼에서 Rust의 파일은 단순히 시스템의 정수 파일 디스크립터로 구성되는데, 이건 절대로 1이 될 수 없기 때문에 가능한 niche가 있습니다!
파일 디스크립터를 반환하는 시스템 호출은 -1을 사용하여 오류가 발생했음을 나타냅니다. (check errno)
그래서 -1이 실제 파일 디스크립터가 될 가능성은 없습니다.
Rust 1.50부터는 이 niche가 타입 정의에 추가되어 레이아웃 최적화에도 사용할 수 있습니다.
그래서 이제 Option
라이브러리 변경점
1.50.0에서는 다음 9개의 함수들이 새로 stable에 들어왔습니다.
bool::then
btree_map::Entry::or_insert_with_key
f32::clamp
f64::clamp
hash_map::Entry::or_insert_with_key
Ord::clamp
RefCell::take
slice::fill
UnsafeCell::get_mut
그리고 몇개의 기존 함수들이 const가 됐습니다.
IpAddr::is_ipv4
IpAddr::is_ipv6
Layout::size
Layout::align
Layout::from_size_align
모든 정수 타입의 pow
모든 정수 타입의 checked_pow
모든 정수 타입의 saturating_pow
모든 정수 타입의 wrapping_pow
모든 unsigned 정수타입의 next_power_of_two
모든 unsigned 정수타입의 checked_power_of_two
다른 변경점들을 보고 싶다면 상세 릴리즈 노트를 참조하세요.
기타 변경점
1.50 릴리즈에는 이외의 기타 변경점들도 있습니다. Rust, Cargo, Clippy에서 무엇이 바뀌었는지 확인해보세요.
1.50.0의 컨트리뷰터들
1.50의 완성엔 수많은 사람들이 함께했습니다. 전부 여러분이 없었다면 불가능했을 거에요.
고마워요!