[Rust] 1.58.0 업데이트 발표 (번역)

https://blog.rust-lang.org/2022/01/13/Rust-1.58.0.html

우리 러스트 팀은 새 버전 [1.58.0]을 발표하게 돼서 정말 기쁩니다!
러스트는 누구든 믿음직하고 효과적인 소프트웨어를 만들 수 있게 도와주는 끝내주는 언어입니다.

만약 rustup을 통해서 Rust의 이전버전을 설치해놓은 상대라면, 업데이트는 아주 쉽습니다. 그냥 이렇게 치면 돼요.
rustup update stable

rustup을 설치한 적이 없다면, 우리 웹사이트의 설치 페이지에서 받을 수 있습니다. 그리고 깃허브에서 이번 버전에 대한 릴리즈 노트를 참조해보세요.




1.58.0엔 무엇이 있나요?

Rust 1.58은 포맷 문자열에 캡처된 식별자, Windows에서 command search path 변경, 표준 라이브러리의 더 많은 #[must_use] 어노테이션, 일부 새로운 라이브러리 안정화를 제공합니다.




포맷 문자열에서의 캡쳐된 식별자

포맷 문자열은 이제 문자열에서 {식별자}의 형태로 간단히 쓰기만 하면 인자를 캡쳐할 수 있습니다.

포맷들은 위치 인수(선택적으로 인덱스 제공)와 명명 된 인수를 허용했습니다.
예를 들어 다음과 같습니다.

println!("Hello, {}!", get_person());** // 암시적 위치******
println!("Hello, {0}!", get_person()); // 명시적 인덱스
**println!("Hello, {person}!", person = get_person()); **// 명명됨

하지만 이제 명명된 인수는 다음과 같이 주변 스코프에서 캡처할 수도 있습니다.

**let person = get_person(); ****// ... ******
**println!("Hello, {person}!"); **// 지역변수 person을 캡쳐

이건 매개변수를 포맷팅하는 데에도 사용할 수 있습니다.

**let (width, precision) = get_format(); **


**for (name, score) in get_scores() { **
** println!("{name}: {score:width$.precision$}"); **
**} **

포맷 문자열은 임의의 경로나 표현식이 아닌 일반 식별자만 캡처할 수 있습니다.
더 복잡한 인자의 경우 먼저 로컬 이름에 할당하거나 예전 방식인 이름 = 표현식 스타일을 사용하세요.

이 기능은 포맷 문자열을 허용하는 모든 매크로에서 작동합니다.
그러나 한 엣지 케이스는 panic!입니다.
2015년과 2018년 버전에서 panic!("{식별자}")는 여전히 포맷되지 않은 문자열로 취급됩니다.

컴파일러는 의도한 효과가 없는 것에 대해 경고할 거에요.

2021년 에디션의 일관성을 향상시키기 위한 panic 매크로의 업데이트로, 2021 panic!에서는 예상대로 작동합니다.




Windows의 Command search path 감축

Windows 타겟에서 std::process::Command는 더 이상 현재 디렉터리에서 실행 파일을 검색하지 않습니다.
이 효과는 win32 CreateProcess API의 과거 동작으로 인한 것이므로, Rust는 효과적으로 다음 순서로 검색했습니다.

  1. (Rust specific) 상위 항목에서 명시적으로 변경된 경우, 하위 항목의 PATH 환경 변수에 나열되는 디렉터리.

  2. 애플리케이션에서 로드된 디렉터리.

  3. 부모 프로세스의 현재 디렉터리

  4. 32-bit Windows 시스템 디렉터리

  5. 16-bit Windows 시스템 디렉터리

  6. Windows 디렉터리

  7. PATH 환경변수에 리스트된 디렉터리들

하지만 현재 디렉터리를 사용하면 신뢰할 수 없는 디렉터리를 처리할 때 놀라운 결과가 발생하거나 악의적인 동작이 잇따를 수 있습니다.

예를 들어 ripgrep은 이러한 방식으로 자식 프로세스를 가로챌 수 있다는 사실을 알게 되자 CVE-2021-3013을 게시했습니다. Microsoft의 자체 PowerShell 문서에도 보안을 위해 현재 디렉터리를 사용하지 않는다는 문서가 있습니다.

이제 Rust는 현재 디렉토리 없이 자체 검색을 수행하고, 위치를 검색하는 API가 없기 때문에 레거시 16비트 디렉토리도 포함되지 않습니다. 따라서 Windows의 Rust에 대한 새로운 명령 검색 순서는 다음과 같습니다.

  1. 자식의 PATH 환경변수에 리스트된 디렉터리들

  2. 애플리케이션에서 로드된 디렉터리

  3. 32-bit Windows 시스템 디렉터리

  4. Windows 디렉터리

5. PATH 환경변수에 리스트된 디렉터리들

Windows가 아닌 타겟은 플랫폼별 동작을 계속 사용하며, 대부분 하위 또는 상위 PATH 환경 변수만 고려합니다.




표준 라이브러리에서의 더 많은 #[must_use]

#[must_use] 속성은 타입이나 함수를 명시적으로 고려하지 않거나 출력이 버그인 것이 거의 확실할 때 적용할 수 있습니다.
이는 오류 조건을 확인해야 하는 Result와 같은 타입의 표준 라이브러리에서 오랫동안 사용되어 왔습니다.
이건 실제로 새 값을 반환할 때 함수가 그 자리에서 값을 변경할 것으로 기대하는 것과 같은 실수를 잡는 데 도움이 됩니다.

라이브러리 제안 35는 2021년 10월에 승인되어 표준 라이브러리 전체에서 #[must_use]의 적용을 감사하고 확장하여, 기본 효과가 반환 값인 더 많은 함수들을 포함합니다.
이것은 함수 순수성의 개념과 유사하지만 실제 언어 기능보다 느슨합니다.
이러한 추가 사항 중 일부는 릴리스 1.57.0에 있었고 이제 1.58.0에서 작업이 완료되었습니다.




Stable이 된 API들

다음 메서드와 트레잇 구현들이 stable이 되었습니다.

Metadata::is_symlink
Path::is_symlink
{integer}::saturating_div
Option::unwrap_unchecked
Result::unwrap_unchecked
Result::unwrap_err_unchecked
File::options

그리고 다음의 stable 함수들은 이제 const입니다.

Duration::new
Duration::checked_add
Duration::saturating_add
Duration::checked_sub
Duration::saturating_sub
Duration::checked_mul
Duration::saturating_mul
Duration::checked_div




기타 변경점

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




1.58.0의 컨트리뷰터들

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