giới thiệu Mặc dù Rust cung cấp cuốn sách Rust nhưng tôi vẫn gặp khó khăn trong việc hiểu từ khóa . Tôi tự hỏi: "Có phải chỉ mình tôi gặp vấn đề này không?" Một tìm kiếm nhanh trên Google đã xác nhận rằng tôi không đơn độc. mut Vì vậy, tôi quyết định viết bài này để giải thích chi tiết về từ khóa . Bài viết này dành cho những người sử dụng các ngôn ngữ cấp cao như Python hoặc JavaScript. mut Các biến Để tạo một biến không thể thay đổi trong Rust, chỉ cần viết . Nó đơn giản. Nếu bạn muốn tạo một biến có thể thay đổi sau này, chỉ cần thêm từ khóa sau . Rust có một quy ước hữu ích khuyến khích sự rõ ràng về ý định. let x = 1337 mut let Việc thêm từ khóa sẽ thông báo cho người khác rằng biến này sẽ được sửa đổi ở một nơi khác trong mã. Được rồi. mut Hãy hình dung nó. Hai biến ở đây, và . let mut x = 1337 let y = 42 Tài liệu tham khảo Hiện tại, mọi thứ đều đơn giản. Tuy nhiên, mọi thứ bắt đầu trở nên khó khăn một chút khi sử dụng tham chiếu . Hãy tạo ra một số. mut let mut x = 1337; let y = 42; let x_ref = &mut x; let y_ref = &y; Tôi đã tạo hai tài liệu tham khảo (hoặc "mượn" theo Rust). Một trong số đó là tham chiếu có thể thay đổi và tham chiếu còn lại là tham chiếu chỉ đọc. Hãy tạo một kế hoạch cho điều đó một lần nữa. Trong sơ đồ đã cho, tôi có 4 biến, 2 trong số đó là tham chiếu. Cả hai biến tham chiếu đều không thay đổi và không có từ khóa sau , điều đó có nghĩa là tôi không thể thay đổi nội dung chúng trỏ tới. Tuy nhiên, tôi vẫn có thể thay đổi giá trị mà họ tham chiếu. mut let *x_ref = 777; Nếu bạn viết điều này, trình biên dịch Rust sẽ không phàn nàn và giá trị của (không phải chính ref) sẽ thay đổi thành . Tuy nhiên, có một hình vuông màu đỏ trên sơ đồ cho biết thiếu tùy chọn có thể thay đổi. Vậy tại sao tôi có thể thay đổi giá trị mà nó đề cập đến? x 777 x_ref Hãy quay lại sơ đồ cho . let x_ref = &mut x Khối màu trắng đầu tiên chứa tên: . Cái thứ hai thông báo cho tôi về loại được lưu trữ trong biến đó. Ở dạng hoàn chỉnh, không có bất kỳ chú thích kiểu ẩn nào, tôi có thể viết như sau: x_ref let x_ref: &mut i32 = &mut x; Tôi có thể hiểu điều này là: hãy tạo một có tên sẽ chứa thành và khởi tạo nó ngay lập tức với thành giá trị trong biến . biến bất biến x_ref tham chiếu có thể thay đổi i32 tham chiếu có thể thay đổi i32 x Điều này có nghĩa là tôi có thể sửa đổi giá trị mà nó trỏ tới, nhưng tôi không thể thay đổi giá trị (hoặc địa chỉ) của tham chiếu. Nói cách khác, tôi không thể viết một cái gì đó như: let x_ref: &mut i32 = &mut x; let mut z = 0; x_ref = &mut z; // Not allowed! Về mặt sơ đồ, tôi muốn thay đổi hướng mũi tên chỉ vào khối mã ở trên. Tuy nhiên, ngay cả khi biến có thể thay đổi, tôi không thể thay đổi mũi tên vì vấn đề nằm ở tính bất biến của chính . z x_ref Để thay đổi hướng mũi tên, tôi cần sửa đổi địa chỉ được lưu trong biến . Tuy nhiên, tôi không thể làm điều này vì biến này không thể thay đổi được. x_ref Hãy làm nó! let mut x: i32 = 1337; let mut x_ref: &mut i32 = &mut x; // I've added mut before x_ref let mut z = 0; x_ref = &mut z; // Allowed! Có quá nhiều trường hợp ở đây xung quanh , phải không? Hãy mô tả chúng. mut x_ref : Tôi đang tạo một biến có thể thay đổi có tên , có nghĩa là tôi có thể thay đổi giá trị của nó sau này. let mut x_ref x_ref : Tôi tuyên bố rằng biến sẽ chứa (các) tham chiếu có thể thay đổi đối với một số giá trị thuộc loại . &mut i32 i32 : Tôi đang mượn (lấy tham chiếu đến) biến . &mut x x Sau đó, tôi tạo một biến có tên và gán cho nó giá trị . Sau đó, khi tôi viết , tôi đã chỉ ra rằng tôi hiểu là một biến có thể thay đổi chỉ có thể chứa các tham chiếu đến các giá trị . z 0 x_ref = &mut z x_ref i32 Vì loại của là nên tôi có thể gán địa chỉ của nó cho biến . Để lấy địa chỉ của , tôi đã sử dụng cú pháp . z i32 x_ref z &mut z Kế hoạch. Thủ thuật tinh thần Hãy xem trong câu lệnh, nó có thể trông hơi rõ ràng một chút, nhưng… = let mut x_ref = &mut x; … Tôi thấy nó như một dải phân cách (đặc biệt nếu bạn xoay nó 90 độ) để chia câu lệnh thành hai câu lệnh phụ: trái và phải. Phía bên trái cung cấp thông tin đó, trong khi phía bên phải cho chúng ta biết . về chính biến về giá trị Khi tôi sử dụng toán tử quy định để thay đổi giá trị... * *x_ref = 100; ... Tôi không thay đổi giá trị của biến . Thay vào đó, tôi đang thay đổi giá trị mà đang tham chiếu. x_ref x_ref Tài liệu tham khảo không thể thay đổi Tôi đã sử dụng thường xuyên trước đây. Nếu tôi bỏ qua một số trong số đó thì sao? mut let i = 1; let j = 2; let mut k = &i; Tôi có thể thay đổi giá trị của ở đây không? Sử dụng kỹ thuật chia, câu trả lời khá đơn giản. Tôi có thể thay đổi giá trị của (tôi thấy ở bên trái), nhưng giá trị (bên phải) là một tham chiếu bất biến đối với (không có ở đây). i k mut i mut Vì thế… let i = 1; let j = 2; let mut k = &i; k = &j; // This is legal. *k = 3; // This is not. Kế hoạch. Phần kết luận Trong bài viết này, chúng tôi đã mổ xẻ các sắc thái của từ khóa và các tài liệu tham khảo. Hãy nhớ rằng có sự khác biệt giữa và chứa tham chiếu. Thủ thuật của chúng tôi? mut tham chiếu có thể thay đổi biến có thể thay đổi Sử dụng dấu làm dấu chia để hiểu rõ hơn các phép gán trong Rust. Hình dung đơn giản này có thể làm sáng tỏ nhiều nhầm lẫn. = Chúc mừng mã hóa!