Có một ví dụ tuyệt vời về ngữ nghĩa di chuyển của Rust được ghi ở đây: Rust Move Semantics trên trang web Rust By Example.Rust di chuyển các biến ngăn xếp không thể sao chép được như thế nào?
Tôi có hiểu biết cơ bản về cả hai trường hợp được chứng minh. Việc đầu tiên là làm thế nào một nguyên thủy có thể có một bí danh mới và bản gốc vẫn có thể được sử dụng bởi vì kết quả cuối cùng là một bản sao nhìn thấy như i32
sử dụng các đặc điểm Copy
. Điều này có ý nghĩa tốt với tôi.
Ngoài ra, vì nhiều lý do tốt, ví dụ thứ hai có ý nghĩa về việc có nhiều bí danh tham chiếu đến số i32
trên heap. Rust thực thi các quy tắc quyền sở hữu và do đó, bí danh ban đầu không thể được sử dụng ngay bây giờ khi một ràng buộc mới đã được tạo. Điều này giúp ngăn chặn các cuộc đua dữ liệu, giải phóng đôi, v.v.
Nhưng dường như có trường hợp thứ ba không được nói đến. Làm thế nào để Rust thực hiện di chuyển các cấu trúc phân bổ ngăn xếp không thực hiện đặc điểm Copy
? này được minh họa bằng đoạn mã sau:
#[derive(Debug)]
struct Employee{
age: i32,
}
fn do_something(m: Employee){
println!("{:?}", m);
}
fn main() {
let x = Employee {
age: 25,
};
do_something(x);
//compiler error below because x has moved
do_something(x);
}
này tôi biết: Trong trường hợp trên, Rust sẽ phân bổ các Employee
trên stack. Cấu trúc trên không thực hiện đặc điểm Copy
và do đó sẽ không được sao chép khi được gán cho bí danh mới. Điều này rất khó hiểu với tôi bởi vì nếu cấu trúc Employee
được phân bổ trên ngăn xếp và cũng không thực hiện đặc điểm Copy
ở đâu/nó di chuyển như thế nào? Liệu nó có được di chuyển đến khung ngăn xếp của do_something()
không?
Bất kỳ trợ giúp nào được đánh giá cao trong việc giải thích câu hỏi hóc búa này.
Bạn có muốn đơn giản hóa ví dụ của mình không? Sẽ là tuyệt vời để làm cho 'Employee' struct ít phức tạp hơn và ít nhất là để loại bỏ tuổi thọ. 'struct Employee {age: i32}' sẽ là đủ, ví dụ. –
@LukasKalbertodt - vâng tôi đã đơn giản hóa ví dụ. –