Tin tức

Rust 1.96.0: Kiểu Range Copy mới, assert_matches!, và Liên kết Wasm chặt chẽ hơn

Rust 1.96.0 giới thiệu các kiểu Range Copy được chờ đợi từ lâu, macro assert_matches!, và thắt chặt xử lý ký hiệu WebAssembly. Cargo cũng sửa hai CVE cho các registry bên thứ ba.

July 5, 2026· 3 min read
Rust 1.96.0: Kiểu Range Copy mới, assert_matches!, và Liên kết Wasm chặt chẽ hơn

Rust 1.96.0 đã ra mắt, và nó mang đến một số thay đổi mà các kỹ sư đang làm việc thực sự quan tâm. Điểm nhấn: các kiểu core::range mới là Copy, macro assert_matches! để chẩn đoán khớp mẫu tốt hơn, và một thay đổi phá vỡ liên kết WebAssembly giúp phát hiện sớm các ký hiệu không xác định.

Kiểu Range Copy Cuối Cùng Cũng Đến

Các kiểu Range cũ triển khai trực tiếp Iterator, nghĩa là chúng không thể đồng thời là Copy — một cái bẫy lâu năm. RFC 3550 đề xuất một sự phân tách rõ ràng: các kiểu core::range::Range, RangeFromRangeInclusive mới triển khai IntoIterator thay thế, để chúng có thể là Copy. Điều này cho phép bạn lưu trữ các bộ truy cập slice trong một struct Copy mà không cần tách các trường start và end. RangeInclusive mới cũng công khai các trường của nó, không giống như phiên bản cũ đã ẩn trạng thái iterator đã cạn. Cú pháp như 0..1 vẫn tạo ra các kiểu cũ cho đến khi có edition mới chuyển sang kiểu mới. Nếu bạn đang viết thư viện, hãy ưu tiên impl RangeBounds trong các API công khai và sử dụng các kiểu cụ thể mới khi có thể.

assert_matches! và debug_assert_matches!

Các macro này về cơ bản là đường cú pháp cho assert!(matches!(..)), nhưng chúng in ra giá trị thực tế khi thất bại — một cải tiến lớn cho việc gỡ lỗi. Chúng không nằm trong prelude để tránh xung đột với các crate bên thứ ba phổ biến, vì vậy bạn cần import chúng một cách tường minh: use core::assert_matches;. Đáng để áp dụng ngay lập tức.

Mục tiêu WebAssembly: Không còn --allow-undefined theo Mặc định

Bắt đầu từ 1.96.0, các mục tiêu WebAssembly không còn truyền --allow-undefined cho trình liên kết. Các ký hiệu không xác định giờ đây tạo ra lỗi liên kết thay vì âm thầm trở thành import từ module "env". Điều này phát hiện sớm các cấu hình xây dựng sai và va chạm ký hiệu vô tình. Nếu bạn thực sự cần hành vi cũ, bạn có thể kích hoạt lại bằng RUSTFLAGS=-Clink-arg=--allow-undefined hoặc chú thích khối ký hiệu với #[link(wasm_import_module = "env")]. Thay đổi này đã được công bố trước đó và bây giờ có hiệu lực.

Cargo Sửa Hai CVE

Hai lỗ hổng mức trung bình/thấp đã được sửa: CVE-2026-5223 (giải nén symlink trong tarball) và CVE-2026-5222 (xác thực với URL đã chuẩn hóa). Cả hai chỉ ảnh hưởng đến người dùng registry bên thứ ba; người dùng crates.io an toàn.

API Đã Ổn Định

  • assert_matches!debug_assert_matches!
  • From<T> for AssertUnwindSafe<T>
  • From<T> for LazyCell<T, F>LazyLock<T, F>
  • Các kiểu core::range::Range, RangeFrom, RangeInclusive mới và iterator của chúng

Chi tiết đầy đủ trong ghi chú phát hành.