[Rust] 1.48.0 업데이트 발표 (번역)
https://blog.rust-lang.org/2020/11/19/Rust-1.48.html
우리 러스트 팀은 새 버전 [1.48.0]을 발표하게 돼서 정말 기쁩니다!
러스트는 누구든 믿음직하고 효과적인 소프트웨어를 만들 수 있게 도와주는 끝내주는 언어입니다.
만약 rustup을 통해서 Rust의 이전버전을 설치해놓은 상대라면, 업데이트는 아주 쉽습니다. 그냥 이렇게 치면 돼요.
rustup update stable
rustup을 설치한 적이 없다면, 우리 웹사이트의 설치 페이지에서 받을 수 있습니다. 그리고 깃허브에서 이번 버전에 대한 릴리즈 노트를 참조해보세요.
1.48.0엔 무엇이 있나요?
이번 릴리즈의 주인공은 Rustdoc입니다. 일부 변경점이 생겼는데, 문서 작성을 더 쉽게 해줄거에요!
본 포스트에서 다루지 않은 기타 변경점들은 상세 릴리즈 노트를 참고하세요.
더 쉬워진 rustdoc의 링크
러스트에 내장된 문서화 도구인 Rustdoc은 마크다운으로 문서를 작성할 수 있게 해줍니다.
이건 사용하기 매우 쉽지만, 몇가지 고통스러운 점을 떠안고 있기도 하죠.
아래와 같은 코드에 문서를 작성한다고 해봅시다.
**pub mod foo **
**{ **
** pub struct Foo; **
**} **
**pub mod bar **
**{ **
** pub struct Bar; **
**} **
2개의 모듈이 있고, 각각 구조체 하나씩을 갖고있죠.
이 구조체 2개를 함께 사용하고 싶다고 상상해봅시다.
우린 문서에 이걸 다음과 같이 기록할 수 있어요.
**pub mod foo **
**{ **
** **** /// Some docs for Foo **
** /// **
** /// You may want to use Foo with Bar. **
** pub struct Foo; **
**} **
**pub mod bar **
**{ **
** ****/// Some docs for Bar **
** /// **
** /// You may want to use Bar with Foo. **
** pub struct Bar; **
**} **
이건 그럭저럭 괜찮아요. 하지만 이 타입 둘을 연결할 수 있다면 더 좋을 것 같네요.
그러면 문서에서 이러한 관계를 지닌 것들을 더 쉽게 탐색할 수 있겠죠.
여기서 문제는, 마크다운은 Rust 코드에 대해서 아는게 없다는 겁니다. rustdoc이 생성하는 URL들도요.
그래서 Rust 개발자들은 보통 이런식으로 링크를 걸어야만 했습니다.
**pub mod foo **
**{ **
** **** /// Some docs for Foo **
** /// **
** /// You may want to use Foo with [Bar]. **
** /// **
** /// [Bar]: ../bar/struct.Bar.html **
** pub struct Foo; **
**} **
**pub mod bar **
**{ **
** ****/// Some docs for Bar **
** /// **
** /// You may want to use Bar with [Foo]. **
** /// **
** /// [Foo]: ../foo/struct.Foo.html **
** pub struct Bar; **
**} **
그냥 상대링크를 사용해서 오프라인에서 동작하도록 했네요.
이건 지루할 뿐만 아니라 오류가 발생하기도 쉽고, 경로를 잘못 지정할 수도 있습니다.
만약 루트 크레이트에 pub use bar::Bar를 쓴다면, 루트에 Bar가 re-export될겁니다.
그럼 이제 저 링크는 잘못된거죠.
다시 이걸 고친다면 모듈 내에서 살아있는 Bar로 연결할때 또 문제가 생기고요.
이런식으로 링크를 다 거는건 못할 짓입니다.
이번 릴리즈에서는 타입을 링크로 거는 것을 rustdoc에게 알려줘서, URL을 생성하게 해주는 일부 문법이 추가되었습니다.
여기에 2개의 다른 예제가 있습니다. 이전 코드를 베이스로 한거에요.
**pub mod foo **
**{ **
** ****/// Some docs for Foo **
** /// **
** /// You may want to use Foo with Bar. **
** pub struct Foo; **
**} **
**pub mod bar **
**{ **
** **** /// Some docs for Bar **
** /// **
** /// You may want to use Bar with [crate::foo::Foo]. **
** pub struct Bar; **
**} **
첫번째 예시는 전과 동일한 텍스트를 보여줄겁니다. 하지만 Bar 타입에 대한 적절한 링크를 생성해줘요.
두번째도 마찬가지로 Foo를 링크하고요.
여기에 사용할수 있는 옵션은 꽤 많은데요.
더 알고싶다면 rustdoc book이 "item들을 이름으로 링크하기" 섹션을 참고하세요.
그리고 Inside Rust에 이 기능의 역사에 대한 포스트가 있으니 읽어보세요. 기여자들 일부가 작성한 겁니다.
검색 별칭(aliases) 추가
이제 항목마다 #[doc(alias = "
이건 더 작은 변경사항인데, 꽤 유용합니다.
이런거에요.
**#[doc(alias = "bar")] **
**struct Foo; **
이렇게 어노테이션을 쓰면, rustdoc이 검색기능에서 bar로 검색한다면 그 결과로 Foo가 나온다는 겁니다. Foo에 bar라는 텍스트가 전혀 없더라도요!
이 별칭에 대한 흥미로운 유스케이스는 FFI 래퍼 crate입니다. 이것들은 각 Rust 함수들을 C 함수에 대한 별칭으로 지정할 수 있으니까요.
기존 C 라이브러리의 사용자라면 더 쉽게 함수들을 검색할 수 있을거에요.
라이브러리 변경점
이번달의 API 변경사항 중 가장 중요한건 이겁니다. [T; N]: TryFrom<Vec
이게 무슨 소리냐고요?
이제 벡터를 주어진 길이의 배열로 전환할 수가 있다는 겁니다.
**use std::convert::TryInto; **
**let v1: Vec
// 이건 성공할 거에요.
// 벡터는 3의 길이를 갖고 있고,
// 배열도 길이가 3이니까요
**let a1: [u32; 3] = v1.try_into().expect("wrong length"); **
**// 하지만 이건 벡터의 길이가 5입니다... **
**let v2: Vec
// ... 이건 패닉을 던질거에요. 길이가 다르니까요.
**let a2: [u32; 3] = v2.try_into().expect("wrong length"); **
저번 릴리즈에서 const generic를 표준 라이브러리에 적용하는 것에 대한 이야기를 했었는데요.
이게 그 좋은 예시입니다. 이제 const generic을 적용한 더 많은 함수들이 생길거에요.
추가로, 이번 릴리즈에서는 다음의 5개 API가 stable이 되었습니다.
다음의 기존 API들은 const 함수가 되었습니다.
더 많은 정보는 상세 릴리스 노트를 확인하세요.
기타 변경점
1.48 릴리즈에는 이외의 기타 변경점들도 있습니다. Rust, Cargo, Clippy에서 무엇이 바뀌었는지 확인해보세요.
1.48.0의 컨트리뷰터들
1.48의 완성엔 수많은 사람들이 함께했습니다. 전부 여러분이 없었다면 불가능했을 거에요.
고마워요!