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ではかなり一般的です。

これを行うもう1つの一般的な方法は、ブロック式を使用することです。

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

44
またはあなたの視点に応じて、「アップグレード」。
Synesso、

8
IMOを書くもう1つの方法は次のとおりです。可変変数は、使用する必要があるときにスコープされ、その後移動されます。意味的に良いです。
Boiethios

@DarthBoiethiosどちらかがコンパイルされたコードに何か変更を加えますか?追加の、役に立たない命令を追加するような?または、不変性の仮定に基づいてコンパイラーによるより積極的な最適化を可能にしますか?
iago-lito

1
@ iago-lito正直なところ、私にはわかりませんが、私の知識のない推測では、何も変更されません。
ボイエチオス

1
@ iago-lito 現時点では実際にあります!ただし、これはバグと見なされ、いずれかの時点で修正される可能性があります。
mcarton

19

ステートメントlet var = var;var不変になり、現在の値にバインドされます。以前fieldsと同様に宣言されましmutた。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.