[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 = "")]을 달아서 rustdoc ui에서 검색시에 검색 별칭을 추가할 수 있습니다.

이건 더 작은 변경사항인데, 꽤 유용합니다.
이런거에요.

**#[doc(alias = "bar")] **
**struct Foo; **

이렇게 어노테이션을 쓰면, rustdoc이 검색기능에서 bar로 검색한다면 그 결과로 Foo가 나온다는 겁니다. Foo에 bar라는 텍스트가 전혀 없더라도요!

이 별칭에 대한 흥미로운 유스케이스는 FFI 래퍼 crate입니다. 이것들은 각 Rust 함수들을 C 함수에 대한 별칭으로 지정할 수 있으니까요.

기존 C 라이브러리의 사용자라면 더 쉽게 함수들을 검색할 수 있을거에요.



라이브러리 변경점

이번달의 API 변경사항 중 가장 중요한건 이겁니다. [T; N]: TryFrom<Vec>가 stable이 되었습니다.

이게 무슨 소리냐고요?

이제 벡터를 주어진 길이의 배열로 전환할 수가 있다는 겁니다.

**use std::convert::TryInto; **
**let v1: Vec = vec![1, 2, 3]; **

// 이건 성공할 거에요.
// 벡터는 3의 길이를 갖고 있고,
// 배열도 길이가 3이니까요
**let a1: [u32; 3] = v1.try_into().expect("wrong length"); **

**// 하지만 이건 벡터의 길이가 5입니다... **
**let v2: Vec = vec![1, 2, 3, 4, 5]; **

// ... 이건 패닉을 던질거에요. 길이가 다르니까요.
**let a2: [u32; 3] = v2.try_into().expect("wrong length"); **

저번 릴리즈에서 const generic를 표준 라이브러리에 적용하는 것에 대한 이야기를 했었는데요.

이게 그 좋은 예시입니다. 이제 const generic을 적용한 더 많은 함수들이 생길거에요.


추가로, 이번 릴리즈에서는 다음의 5개 API가 stable이 되었습니다.

slice::as_ptr_range

slice::as_mut_ptr_range

VecDeque::make_contiguous

future::pending

future::ready


다음의 기존 API들은 const 함수가 되었습니다.

Option::is_some

Option::is_none

Option::as_ref

Result::is_ok

Result::is_err

Result::as_ref

Ordering::reverse

Ordering::then

더 많은 정보는 상세 릴리스 노트를 확인하세요.



기타 변경점

1.48 릴리즈에는 이외의 기타 변경점들도 있습니다. RustCargoClippy에서 무엇이 바뀌었는지 확인해보세요.



1.48.0의 컨트리뷰터들

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