Tim Rust dengan senang hati mengumumkan versi baru Rust, 1.78.0. Rust adalah bahasa pemrograman yang memberdayakan semua orang untuk membangun perangkat lunak yang andal dan efisien.
\ Jika Anda memiliki versi Rust sebelumnya yang diinstal melalui rustup, Anda bisa mendapatkan 1.78.0 dengan:
$ rustup update stable
\ Jika Anda belum memilikinya, Anda bisa mendapatkan rustup dari halaman yang sesuai di situs web kami, dan memeriksa catatan rilis terperinci untuk 1.78.0.
\ Jika Anda ingin membantu kami dengan menguji rilis masa depan, Anda mungkin ingin mempertimbangkan untuk memperbarui secara lokal untuk menggunakan saluran beta (rustup default beta) atau saluran nightly (rustup default nightly). Harap laporkan bug apa pun yang mungkin Anda temui!
Rust sekarang mendukung namespace atribut #[diagnostic] untuk mempengaruhi pesan kesalahan kompiler. Ini diperlakukan sebagai petunjuk yang tidak wajib digunakan oleh kompiler, dan juga bukan merupakan kesalahan untuk memberikan diagnostik yang tidak dikenali oleh kompiler. Fleksibilitas ini memungkinkan kode sumber untuk memberikan diagnostik bahkan ketika tidak didukung oleh semua kompiler, baik itu versi yang berbeda atau implementasi yang sepenuhnya berbeda.
\ Dengan namespace ini datang atribut pertama yang didukung, #[diagnostic::on_unimplemented], yang dapat ditempatkan pada trait untuk menyesuaikan pesan ketika trait tersebut diperlukan tetapi belum diimplementasikan pada suatu tipe. Pertimbangkan contoh yang diberikan dalam permintaan stabilisasi:
#[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()); }
\ Sebelumnya, kompiler akan memberikan kesalahan bawaan seperti ini:
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 |
\ Dengan #[diagnostic::on_unimplemented], pesan kustomnya mengisi baris kesalahan utama, dan label kustomnya ditempatkan pada output sumber. Label asli masih ditulis sebagai output bantuan, dan catatan kustom apa pun juga ditulis. (Detail persis ini dapat berubah.)
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
\ Untuk penulis trait, jenis diagnostik ini lebih berguna jika Anda dapat memberikan petunjuk yang lebih baik daripada hanya berbicara tentang implementasi yang hilang itu sendiri. Misalnya, ini adalah contoh singkat dari pustaka standar:
#[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 {}
\ Untuk informasi lebih lanjut, lihat bagian referensi tentang namespace atribut alat diagnostic.
unsafePustaka standar Rust memiliki sejumlah pernyataan untuk prakondisi fungsi unsafe, tetapi secara historis mereka hanya diaktifkan dalam build #[cfg(debug_assertions)] dari pustaka standar untuk menghindari mempengaruhi kinerja rilis. Namun, karena pustaka standar biasanya dikompilasi dan didistribusikan dalam mode rilis, sebagian besar pengembang Rust tidak pernah menjalankan pemeriksaan ini sama sekali.
\ Sekarang, kondisi untuk pernyataan ini ditunda sampai generasi kode, sehingga mereka akan diperiksa tergantung pada pengaturan pengguna sendiri untuk pernyataan debug -- diaktifkan secara default dalam build debug dan test. Perubahan ini membantu pengguna menangkap perilaku yang tidak terdefinisi dalam kode mereka, meskipun detail tentang seberapa banyak yang diperiksa umumnya tidak stabil.
\ Misalnya, slice::from_raw_parts memerlukan pointer non-null yang sejajar. Penggunaan pointer yang sengaja tidak sejajar berikut memiliki perilaku yang tidak terdefinisi, dan meskipun jika Anda tidak beruntung mungkin tampak "bekerja" di masa lalu, pernyataan debug sekarang dapat menangkapnya:
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.
Pustaka standar memiliki beberapa fungsi yang mengubah penyejajaran pointer dan slice, tetapi sebelumnya mereka memiliki peringatan yang membuatnya sulit untuk diandalkan dalam praktik, jika Anda mengikuti dokumentasi mereka dengan tepat. Peringatan tersebut terutama ada sebagai lindung nilai terhadap evaluasi const, tetapi mereka hanya stabil untuk penggunaan non-const saja. Mereka sekarang dijanjikan memiliki perilaku runtime yang konsisten sesuai dengan input aktual mereka.
pointer::align_offset menghitung offset yang diperlukan untuk mengubah pointer ke penyejajaran yang diberikan. Ini mengembalikan usize::MAX jika itu tidak mungkin, tetapi sebelumnya diizinkan untuk selalu mengembalikan usize::MAX, dan sekarang perilaku itu dihapus.slice::align_to dan slice::align_to_mut keduanya mentransmutasi slice menjadi slice tengah yang sejajar dan slice kepala dan ekor yang tidak sejajar yang tersisa. Metode ini sekarang menjanjikan untuk mengembalikan bagian tengah terbesar yang mungkin, daripada memungkinkan implementasi untuk mengembalikan sesuatu yang kurang optimal seperti mengembalikan semuanya sebagai slice kepala.impl Read for &Stdin'static untuk beberapa implementasi terkait std::error::Errorimpl<Fd: AsFd> impl mengambil ?Sizedimpl From<TryReserveError> for io::Error\ API ini sekarang stabil dalam konteks 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 yang diumumkan untuk target x86-32 dan x86-64. Distributor yang menggunakan LLVM mereka sendiri yang lebih lama dari 18 mungkin masih menghadapi bug konvensi pemanggilan yang disebutkan dalam posting itu.Periksa semua yang berubah di Rust, Cargo, dan Clippy.
Banyak orang berkumpul untuk menciptakan Rust 1.78.0. Kami tidak bisa melakukannya tanpa kalian semua. Terima kasih!
Tim Rilis Rust
\ Juga dipublikasikan di sini
\ Foto oleh Ubaid E. Alyafizi di Unsplash


