Trong một đề xuất kỹ thuật, nhóm phát triển Rust vừa công bố kế hoạch giới thiệu hai trait mới là Move và Forget. Đề xuất này nhằm giải quyết những hạn chế cố hữu của ngôn ngữ này, đặc biệt là trong việc xử lý các kiểu dữ liệu tự tham chiếu (self-referential) và đảm bảo destructor luôn được chạy.
Vấn đề lớn của Rust hiện tại
Hiện nay, Rust giả định mọi giá trị đều có thể được di chuyển trong bộ nhớ và có thể bị "lãng quên" thông qua hàm mem::forget. Điều này gây ra phức tạp lớn khi lập trình viên muốn xây dựng các async future tự tham chiếu, vốn không thể di chuyển an toàn. Giải pháp hiện tại là dùng kiểu Pin, nhưng nó mã hóa tính bất động như một thuộc tính của vị trí (place) thay vì kiểu dữ liệu, dẫn đến sự rườm rà không cần thiết.
Thêm vào đó, việc mem::forget an toàn đồng nghĩa với việc Rust không thể đảm bảo destructor của một kiểu dữ liệu như Transaction hay ScopedTaskHandle sẽ luôn được thực thi. Điều này chặn đường phát triển các mẫu lập trình an toàn như scoped spawn cho async, nơi tác vụ con mượn dữ liệu từ scope cha.
Giải pháp từ trait Move và Forget
Đề xuất mới muốn thay đổi cách tiếp cận bằng cách biến khả năng di chuyển và bị lãng quên thành các trait tường minh. Với trait Move, các kiểu dữ liệu có thể khai báo rõ chúng có được phép di chuyển trong bộ nhớ hay không. Điều này giúp đơn giản hóa việc xây dựng các kiểu tự tham chiếu, và đơn giản hơn Pin vì tính bất động là thuộc tính của kiểu dữ liệu, không phải của vị trí. Tương tự, trait Forget cho phép các kiểu dữ liệu "chọn không" bị bỏ quên, từ đó đảm bảo destructor luôn được gọi.
Việc này được ví như bước tiếp nối của trait Sized, vốn đã nới lỏng giả định mọi kiểu phải có kích thước cố định. Nhóm phát triển dự kiến sẽ triển khai bản thử nghiệm (MVP) trong compiler, viết RFC và kiểm chứng thực tế trên mã nguồn Linux Kernel.






