'let x = x' ทำอะไรใน Rust?


117

ฉันเห็นรหัสนี้ในป่า :

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

อะไรlet fields = fields;สายทำอย่างไร ทำไมถึงมี?

คำตอบ:


144

มันทำให้fieldsไม่เปลี่ยนรูปอีกครั้ง

fieldsก่อนหน้านี้ถูกกำหนดให้เป็น mutable ( 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.