'Let x = x' làm gì trong Rust?


117

Tôi thấy mã này trong tự nhiên :

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

Không những gì let fields = fields;dòng làm gì? Tại sao nó ở đó?

Câu trả lời:


144

Nó làm cho fieldsbất biến một lần nữa.

fieldstrước đây được định nghĩa là mutable ( let mut fields = …;), được sử dụng sort_by_keyđể sắp xếp tại chỗ và yêu cầu mục tiêu phải có thể thay đổi. Tác giả đã chọn ở đây để ngăn chặn rõ ràng sự biến đổi hơn nữa.

"Hạ cấp" một ràng buộc có thể thay đổi thành bất biến là khá phổ biến ở Rust.

Một cách phổ biến khác để làm điều này là sử dụng biểu thức khối:

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

44
Hoặc "nâng cấp", tùy theo quan điểm của bạn.
Synesso

8
IMO cách khác của bạn để viết đó là cách để đi: biến có thể thay đổi được đặt trong khoảng thời gian chúng ta cần sử dụng nó, và sau đó nó được di chuyển. Nó là tốt hơn về mặt ngữ nghĩa.
Boiethios

@DarthBoiethios Liệu cái này hay cái kia có thay đổi gì đối với mã được biên dịch không? Giống như thêm một hướng dẫn bổ sung, vô dụng? Hoặc cho phép tối ưu hóa mạnh mẽ hơn bởi trình biên dịch dựa trên các giả định bất biến?
iago-lito 'xem xét rời khỏi

1
@ iago-lito Thành thật mà nói, tôi không chắc, nhưng suy đoán vô học của tôi là điều đó không thay đổi gì cả.
Boiethios

1
@ iago-lito Ngay bây giờ nó thực sự làm! Tuy nhiên đây được coi là một lỗi và có khả năng sẽ được sửa chữa tại một số điểm.
mcarton

19

Tuyên bố let var = var;làm cho varbất biến và ràng buộc với giá trị hiện tại của nó. fieldsđã được tuyên bố như muttrước đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.