Apa yang dilakukan 'let x = x' di Rust?

117

Saya melihat kode ini di alam liar :

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

Apa fungsi let fields = fields;garis itu? Kenapa disana?

timthelion
sumber

Jawaban:

144

Itu membuat fieldskekekalan lagi.

fieldssebelumnya didefinisikan sebagai mutable ( let mut fields = …;), untuk digunakan dengan sort_by_keymengurutkan di tempat dan membutuhkan target untuk bisa berubah. Penulis telah memilih di sini untuk secara eksplisit mencegah mutabilitas lebih lanjut.

"Menurunkan" pengikatan yang dapat diubah menjadi yang tidak dapat diubah cukup umum di Rust.

Cara umum lainnya untuk melakukan ini adalah dengan menggunakan ekspresi blok:

let fields = {
    let mut fields =;
    fields.sort_by_key();
    fields
};
Mcarton.dll
sumber
44
Atau "meningkatkan", tergantung pada perspektif Anda.
Synesso
8
IMO cara Anda yang lain untuk menulis itu adalah cara untuk pergi: variabel yang bisa berubah dibatasi waktu yang kita butuhkan untuk menggunakannya, dan kemudian dipindahkan. Lebih baik secara semantik.
Boiethios
@DarthBoiethios Apakah salah satu atau yang lain mengubah sesuatu ke kode yang dikompilasi? Suka menambahkan instruksi tambahan yang tidak berguna? Atau mengaktifkan pengoptimalan yang lebih agresif oleh kompilator berdasarkan asumsi kekekalan?
iago-lito 'mempertimbangkan untuk berangkat
1
@ iago-lito Sejujurnya, saya tidak yakin, tapi tebakan saya yang tidak terpelajar adalah itu tidak mengubah apapun.
Boiethios
1
@ iago-lito Sekarang ini benar-benar terjadi! Namun, ini dianggap bug dan kemungkinan besar akan diperbaiki di beberapa titik.
mcarton
19

Pernyataan itu let var = var;membuat vartidak berubah dan terikat pada nilainya saat ini. fieldsdideklarasikan seperti mutsebelumnya.

Govind Parmar
sumber