Rilis Rust 1.40.0: # [non_exhaustive], perangkat tambahan makro, dan perangkat tambahan lainnya

Tim Rust senang mengumumkan rilis versi baru, 1.40.0. Rust adalah bahasa pemrograman yang memungkinkan semua orang membuat perangkat lunak yang andal dan efisien.


Jika Anda menginstal versi Rust sebelumnya menggunakan rustup , maka untuk meningkatkan ke versi 1.40.0 Anda hanya perlu menjalankan perintah berikut:


 $ rustup update stable 

Jika Anda belum menginstal rustup , Anda dapat menginstalnya dari halaman terkait situs web kami, serta melihat catatan rilis terperinci di GitHub.


Apa yang termasuk dalam versi stabil 1.40.0


Inovasi utama adalah pengenalan atribut #[non_exhaustive] , peningkatan macros!() Dan #[attribute] . Akhirnya, peringatan penganalisa migrasi peminjam menjadi bug di Rust 2015. Lihat catatan rilis untuk informasi lebih lanjut.


#[non_exhaustive] struktur, enum, dan opsi enumerasi


Misalkan Anda adalah penulis pustaka alpha yang berisi pub struct Foo . Anda ingin membuat bidang struktur alpha::Foo publik, tetapi Anda tidak yakin apakah Anda harus menambahkan lebih banyak bidang ke Foo di rilis mendatang. Dilema muncul: Anda membuat bidang menjadi pribadi dengan ketidaknyamanan berikutnya, atau Anda berisiko menempatkan pengguna dalam ketergantungan pada bidang dan kemudian melanggar kode mereka saat menambahkan yang baru. Karat 1.40.0 memperkenalkan cara untuk memecahkan masalah dengan #[non_exhaustive] .


Atribut #[non_exhaustive] dilampirkan pada struktur atau varian enumerasi dan mencegah perbandingan penuh bidang, pembuatan struktur tersebut atau varian di luar peti dengan deklarasi mereka. Contoh berikut menunjukkan kesalahan dalam peti beta alfa-dependen:


 // alpha/lib.rs: #[non_exhaustive] struct Foo { pub a: bool, } enum Bar { #[non_exhaustive] Variant { b: u8 } } fn make_foo() -> Foo { ... } fn make_bar() -> Bar { ... } // beta/lib.rs: let x = Foo { a: true }; //~  let Foo { a } = make_foo(); //~  let Foo { a, .. } = make_foo(); //~ OK // -- `beta`       . let x = Bar::Variant { a: 42 }; //~  let Bar::Variant { b } = make_bar(); //~  let Bar::Variant { b, .. } = make_bar(); //~ OK // -- `beta`    ... 

Apa yang terjadi di balik layar? Visibilitas konstruktor untuk struktur atau opsi enumerasi #[non_exhaustive] akan dikurangi menjadi pub(crate) , sehingga melarang penggunaannya di peti pihak ketiga.


Mungkin aspek yang lebih penting dari #[non_exhaustive] adalah atribut dapat dilampirkan ke enumerasi sendiri. Ini adalah kode yang diambil dari std::cmp::Ordering :


 #[non_exhaustive] pub enum Ordering { Relaxed, Release, Acquire, AcqRel, SeqCst } 

Dalam hal ini, #[non_exhaustive] menjamin kemungkinan menambahkan opsi baru di masa mendatang. Ini dicapai dengan melarang paket lain menggunakan pencocokan gambar lengkap untuk Ordering . Kompiler akan menolak yang berikut:


 match ordering { Relaxed | Release | Acquire | AcqRel | SeqCst => { /* logic */ } //~^ ;      , //   ,        . } 

Sebagai gantinya, paket lain sekarang harus mempertimbangkan kemungkinan opsi enumerasi baru, misalnya, menambahkan _ wildcard:


 match ordering { Relaxed | Release | Acquire | AcqRel | SeqCst => { /* logic */ } _ => { /* logic */ } // OK;     ,   . } 

Detail tentang atribut #[non_exhaustive] tersedia di laporan stabilisasi .


Peningkatan Makro dan Atribut


Di 1.40.0, kami melakukan beberapa peningkatan pada makro dan atribut, termasuk:


  • mac!() dalam konteks tipe.


    Misalnya, Anda dapat menulis type Foo = expand_to_type!(bar); di mana expand_to_type akan menjadi makro prosedural.


  • extern { ... } blok.


    Blok ini termasuk make_item!() Macro. Sebagai contoh:


     macro_rules! make_item { ($name:ident) => { fn $name(); } } extern { make_item!(alpha); make_item!(beta); } 

    Atribut prosedural makro untuk elemen di blok extern { ... } sekarang juga didukung:


     extern "C" { #[my_identity_macro] //~  ,     `fn foo();`. fn foo(); } 

  • macro_rules! item dalam macro prosedural.


    Makro dengan sintaks fungsi ( mac!() ) Dan atribut ( #[mac] ) sekarang dapat menghasilkan macro_rules! . Lihat laporan stabilisasi terlampir untuk detail lebih lanjut.


  • TokenStream $m:meta mendukung TokenStream .


    Yaitu, kode berikut ini benar:


     macro_rules! accept_meta { ($m:meta) => {} } accept_meta!( my::path ); accept_meta!( my::path = "lit" ); accept_meta!( my::path ( abc ) ); accept_meta!( my::path [ abc ] ); accept_meta!( my::path { abc } ); 


Peringatan migrasi parser peminjam menjadi bug di edisi Rust 2015


Dalam rilis 1.35.0, kami melaporkan bahwa NLL muncul di edisi Rust 2015 setelah rilis pertama untuk edisi 2018 di Rust 1.31 .


Seperti yang kami katakan, penganalisis pinjaman lama dapat memungkinkan manajemen memori tidak aman, dan dengan penganalisa baru (pemeriksa pinjaman NLL) kekurangan ini diselesaikan. Karena kesalahan ini dapat mengganggu kode stabil, kami memutuskan untuk secara bertahap memperkenalkan kesalahan ini, memeriksa apakah penganalisa lama akan memungkinkan perakitan program dan apakah yang baru akan memblokirnya. Dalam kasus ini, kesalahan digantikan oleh peringatan.


Rilis Rust 1.39.0 sebelumnya menggantikan peringatan ini dengan kesalahan kode dengan edisi 2018 . Karat 1.40.0 akan menerapkan perubahan yang sama pada kode edisi 2015 , secara permanen menutup lubang keamanan ini. Bersamaan dengan ini, kompiler bahkan dibersihkan dari kode lama !


Jika proyek Anda tidak akan disebabkan oleh perubahan di atas, atau Anda ingin tahu lebih banyak, baca posting Niko Matsakis .


Lebih banyak fungsi konstan di perpustakaan standar


Dimulai dengan Rust 1.40.0, fungsi berikut ditandai sebagai konstan ( const fn ):



Fungsi stabil di perpustakaan standar


Fungsi dan makro berikut ini distabilkan di Rust 1.40.0:



Perubahan lainnya


Sintaks , manajer paket kargo, dan penganalisa Clippy juga telah mengalami beberapa perubahan.


Baca catatan kompatibilitas untuk melihat apakah perubahan ini memengaruhi Anda.


Anggota 1.40.0


Banyak orang datang bersama untuk membuat Rust 1.40.0. Kami tidak bisa melakukan ini tanpa kalian semua, terima kasih !


Dari penerjemah


Dengan pertanyaan tentang bahasa Rust, mereka akan dapat membantu Anda dalam obrolan Telegram berbahasa Rusia atau dalam obrolan serupa untuk pendatang baru .


Artikel ini secara bersama-sama diterjemahkan oleh andreevlex , blandger , funkill , Hippolot , P0lunin , PsyHaSTe dan LooMaclin .

Source: https://habr.com/ru/post/id481070/


All Articles