Rust에서 'let x = x'는 무엇을합니까?


117

이 코드 는 야생에서 보았습니다 .

fields.sort_by_key(|&(_, ref field)| field.tags().into_iter().min().unwrap());
let fields = fields;

뭐라고합니까 let fields = fields;라인은 무엇입니까? 왜 거기에 있습니까?

답변:


144

그것은 만드는 fields불변 다시합니다.

fields이전에 변경 가능 ( let mut fields = …;) 으로 정의되어 sort_by_key제자리에서 정렬되고 대상이 변경 가능해야하는 데 사용됩니다 . 저자는 추가 변경 가능성을 명시 적으로 방지하기 위해 여기에서 선택했습니다.

변경 가능한 바인딩을 변경 불가능한 바인딩 "다운 그레이드"하는 것은 Rust에서 매우 일반적입니다.

이를 수행하는 또 다른 일반적인 방법은 블록 표현식을 사용하는 것입니다.

let fields = {
    let mut fields =;
    fields.sort_by_key();
    fields
};

44
또는 귀하의 관점에 따라 "업그레이드".
Synesso

8
IMO를 작성하는 또 다른 방법은 이동 방법입니다. 변경 가능한 변수는 우리가 사용해야하는 시간 범위가 지정된 다음 이동됩니다. 의미 상 더 좋습니다.
Boiethios

@DarthBoiethios 하나 또는 다른 하나가 컴파일 된 코드를 변경합니까? 쓸모없는 추가 지침을 추가하는 것처럼? 또는 불변성 가정을 기반으로 컴파일러에서보다 적극적인 최적화를 가능하게합니까?
iago-lito

1
@ iago-lito 솔직히 잘 모르겠지만 내 무식한 추측은 아무것도 바뀌지 않는다는 것입니다.
Boiethios

1
@ iago-lito 지금 실제로 그렇습니다 ! 그러나 이것은 버그로 간주되며 어느 시점에서 수정 될 가능성이 있습니다.
mcarton

19

이 명령문 let var = var;var변경 불가능 하게 만들고 현재 값에 바인딩됩니다. 이전 fields과 같이 선언되었습니다 mut.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.