Đội ngũ Rust vui mừng thông báo phiên bản mới của Rust, 1.78.0. Rust là ngôn ngữ lập trình giúp mọi người xây dựng phần mềm đáng tin cậy và hiệu quả.
Nếu bạn đã cài đặt phiên bản Rust trước đó thông qua rustup, bạn có thể cập nhật lên 1.78.0 bằng:
$ rustup update stable
Nếu bạn chưa có, bạn có thể tải rustup từ trang thích hợp trên trang web của chúng tôi, và xem ghi chú phát hành chi tiết cho 1.78.0.
Nếu bạn muốn giúp chúng tôi bằng cách kiểm tra các phiên bản trong tương lai, bạn có thể cân nhắc cập nhật cục bộ để sử dụng kênh beta (rustup default beta) hoặc kênh nightly (rustup default nightly). Vui lòng báo cáo bất kỳ lỗi nào bạn có thể gặp phải!
Rust hiện hỗ trợ không gian tên thuộc tính #[diagnostic] để ảnh hưởng đến thông báo lỗi của trình biên dịch. Những thuộc tính này được coi là gợi ý mà trình biên dịch không bắt buộc phải sử dụng, và cũng không phải là lỗi khi cung cấp chẩn đoán mà trình biên dịch không nhận ra. Tính linh hoạt này cho phép mã nguồn cung cấp chẩn đoán ngay cả khi chúng không được hỗ trợ bởi tất cả các trình biên dịch, dù đó là các phiên bản khác nhau hoặc các triển khai hoàn toàn khác nhau.
Với không gian tên này, thuộc tính được hỗ trợ đầu tiên là #[diagnostic::on_unimplemented], có thể được đặt trên một trait để tùy chỉnh thông báo khi trait đó được yêu cầu nhưng chưa được triển khai trên một kiểu. Hãy xem xét ví dụ được đưa ra trong yêu cầu ổn định:
#[diagnostic::on_unimplemented( message = "My Message for `ImportantTrait<{A}>` is not implemented for `{Self}`", label = "My Label", note = "Note 1", note = "Note 2" )] trait ImportantTrait<A> {} fn use_my_trait(_: impl ImportantTrait<i32>) {} fn main() { use_my_trait(String::new()); }
Trước đây, trình biên dịch sẽ đưa ra lỗi tích hợp như sau:
error[E0277]: the trait bound `String: ImportantTrait<i32>` is not satisfied --> src/main.rs:12:18 | 12 | use_my_trait(String::new()); | ------------ ^^^^^^^^^^^^^ the trait `ImportantTrait<i32>` is not implemented for `String` | | | required by a bound introduced by this call |
Với #[diagnostic::on_unimplemented], thông báo tùy chỉnh của nó điền vào dòng lỗi chính, và nhãn tùy chỉnh của nó được đặt trên đầu ra nguồn. Nhãn gốc vẫn được viết dưới dạng đầu ra trợ giúp, và bất kỳ ghi chú tùy chỉnh nào cũng được viết. (Những chi tiết chính xác này có thể thay đổi.)
error[E0277]: My Message for `ImportantTrait<i32>` is not implemented for `String` --> src/main.rs:12:18 | 12 | use_my_trait(String::new()); | ------------ ^^^^^^^^^^^^^ My Label | | | required by a bound introduced by this call | = help: the trait `ImportantTrait<i32>` is not implemented for `String` = note: Note 1 = note: Note 2
Đối với tác giả trait, loại chẩn đoán này hữu ích hơn nếu bạn có thể cung cấp gợi ý tốt hơn thay vì chỉ nói về việc thiếu triển khai. Ví dụ, đây là một mẫu rút gọn từ thư viện tiêu chuẩn:
#[diagnostic::on_unimplemented( message = "the size for values of type `{Self}` cannot be known at compilation time", label = "doesn't have a size known at compile-time" )] pub trait Sized {}
Để biết thêm thông tin, hãy xem phần tham khảo về không gian tên thuộc tính công cụ diagnostic.
unsafeThư viện tiêu chuẩn Rust có một số khẳng định cho các điều kiện tiên quyết của các hàm unsafe, nhưng theo truyền thống chúng chỉ được kích hoạt trong các bản dựng #[cfg(debug_assertions)] của thư viện tiêu chuẩn để tránh ảnh hưởng đến hiệu suất phát hành. Tuy nhiên, vì thư viện tiêu chuẩn thường được biên dịch và phân phối ở chế độ phát hành, hầu hết các nhà phát triển Rust không bao giờ thực thi các kiểm tra này.
Bây giờ, điều kiện cho các khẳng định này được trì hoãn cho đến khi tạo mã, vì vậy chúng sẽ được kiểm tra tùy thuộc vào cài đặt khẳng định gỡ lỗi của người dùng - được kích hoạt theo mặc định trong các bản dựng gỡ lỗi và kiểm tra. Thay đổi này giúp người dùng phát hiện hành vi không xác định trong mã của họ, mặc dù chi tiết về mức độ kiểm tra thường không ổn định.
Ví dụ, slice::from_raw_parts yêu cầu một con trỏ không rỗng được căn chỉnh. Việc sử dụng con trỏ không căn chỉnh có chủ đích sau đây có hành vi không xác định, và nếu bạn không may mắn, nó có thể có vẻ "hoạt động" trong quá khứ, khẳng định gỡ lỗi hiện có thể phát hiện nó:
fn main() { let slice: &[u8] = &[1, 2, 3, 4, 5]; let ptr = slice.as_ptr(); // Create an offset from `ptr` that will always be one off from `u16`'s correct alignment let i = usize::from(ptr as usize & 1 == 0); let slice16: &[u16] = unsafe { std::slice::from_raw_parts(ptr.add(i).cast::<u16>(), 2) }; dbg!(slice16); } thread 'main' panicked at library/core/src/panicking.rs:220:5: unsafe precondition(s) violated: slice::from_raw_parts requires the pointer to be aligned and non-null, and the total size of the slice not to exceed `isize::MAX` note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace thread caused non-unwinding panic. aborting.
Thư viện tiêu chuẩn có một vài hàm thay đổi sự căn chỉnh của con trỏ và slice, nhưng trước đây chúng có những điều kiện làm cho chúng khó tin cậy trong thực tế, nếu bạn tuân theo tài liệu của chúng một cách chính xác. Những điều kiện đó chủ yếu tồn tại như một biện pháp phòng ngừa đối với đánh giá const, nhưng dù sao chúng chỉ ổn định cho việc sử dụng không phải const. Bây giờ chúng được hứa hẹn có hành vi thời gian chạy nhất quán theo đầu vào thực tế của chúng.
pointer::align_offset tính toán offset cần thiết để thay đổi con trỏ thành căn chỉnh đã cho. Nó trả về usize::MAX nếu điều đó không thể, nhưng trước đây nó được phép luôn luôn trả về usize::MAX, và bây giờ hành vi đó đã bị loại bỏ.slice::align_to và slice::align_to_mut đều chuyển đổi slice thành một slice giữa được căn chỉnh và các slice đầu và đuôi không được căn chỉnh còn lại. Các phương thức này hiện hứa hẹn sẽ trả về phần giữa lớn nhất có thể, thay vì cho phép triển khai trả về thứ gì đó kém tối ưu hơn như trả về mọi thứ dưới dạng slice đầu.impl Read for &Stdin'static cho một số triển khai liên quan đến std::error::Errorimpl<Fd: AsFd> impl nhận ?Sizedimpl From<TryReserveError> for io::ErrorCác API này hiện đã ổn định trong ngữ cảnh const:
Barrier::new()x86_64-pc-windows-msvci686-pc-windows-msvcx86_64-pc-windows-gnui686-pc-windows-gnux86_64-pc-windows-gnullvmi686-pc-windows-gnullvmu128/i128 đã thông báo cho các mục tiêu x86-32 và x86-64. Các nhà phân phối sử dụng LLVM riêng của họ cũ hơn 18 có thể vẫn gặp phải các lỗi quy ước gọi được đề cập trong bài đăng đó.Kiểm tra tất cả những gì đã thay đổi trong Rust, Cargo và Clippy.
Nhiều người đã cùng nhau tạo ra Rust 1.78.0. Chúng tôi không thể làm được điều đó nếu không có tất cả các bạn. Cảm ơn!
Đội ngũ Phát hành Rust
Cũng được xuất bản tại đây
Ảnh của Ubaid E. Alyafizi trên Unsplash


