Rust 1.34 Rilis

Halo, Habr! Saya mempersembahkan kepada Anda terjemahan artikel "Tim Rilis Karat" Mengumumkan Karat 1.34.0 " .


Tim pengembangan Rust dengan bangga mengumumkan rilis versi baru Rust, 1.34.0. Rust adalah bahasa pemrograman yang memungkinkan semua orang membuat perangkat lunak yang andal dan efisien.


Jika Anda memiliki versi Rust sebelumnya yang diinstal menggunakan rustup, maka untuk meningkatkan versi Rust ke versi 1.34.0 Anda hanya perlu melakukan:


$ rustup update stable 

Jika Anda belum menginstal rustup, Anda dapat menginstalnya dari halaman yang sesuai di situs web kami.


Apa yang termasuk dalam versi stabil 1.34.0


Peningkatan utama untuk rilis ini adalah dukungan untuk pendaftar kargo alternatif. Apakah rilis ini juga menyertakan dukungan ? dalam tes dokumentasi, beberapa peningkatan dalam #[attribute(...)] dan stabilisasi TryFrom . Baca tentang hal-hal penting atau lihat catatan rilis terperinci untuk informasi lebih lanjut.


Registrasi cargo alternatif


Sebelum versi 1.0, Rust memiliki registry publik, crates.io . Orang-orang menerbitkan peti menggunakan cargo publish dan dengan mudah menghubungkan peti ini di bagian [dependencies] Cargo.toml .


Namun, tidak semua orang ingin mempublikasikan peti mereka di crates.io. Orang yang mendukung proyek sumber tertutup tidak dapat menggunakan crates.io, dan sebagai gantinya mereka harus menentukan git atau path dalam dependensi. Tidak ada yang seperti ini untuk proyek-proyek kecil, tetapi jika organisasi Anda memiliki banyak peti sumber tertutup, Anda kehilangan manfaat dari dukungan versi, yang tersedia di crates.io.


Dimulai dengan rilis ini, Cargo dapat mendukung pendaftar alternatif. Registri ini hidup berdampingan dengan crates.io, sehingga Anda dapat menulis program yang bergantung pada crates.io dan registri Anda. Namun, subracks crates.io tidak dapat bergantung pada registri eksternal.


Untuk menggunakan pendaftar alternatif, Anda harus menambahkan baris berikut ke .cargo/config . File ini bisa di direktori home Anda ( ~/.cargo/config ) atau di direktori paket.


 [registries] my-registry = { index = "https://my-intranet:8080/git/index" } 

Menambahkan ketergantungan dari registri alternatif itu mudah. Saat Anda menentukan ketergantungan pada Cargo.toml , gunakan kunci registry agar Cargo tahu bahwa Anda ingin menerima peti dari registri alternatif:


 [dependencies] other-crate = { version = "1.0", registry = "my-registry" } 

Sebagai penulis peti, jika Anda ingin menerbitkan peti Anda di registri alternatif, hal pertama yang perlu Anda lakukan adalah menyimpan token otentikasi di ~/.cargo/credentials menggunakan perintah cargo login :


 cargo login --registry=my-registry 

Selanjutnya, Anda dapat menggunakan flag --registry untuk menentukan registri tempat rak akan diterbitkan:


 cargo publish --registry=my-registry 

Tentang bagaimana Anda dapat menjalankan registri Anda sendiri, Anda dapat menemukannya di dokumentasi .


? dalam tes dokumentasi


Apakah RFC 1937 mengusulkan untuk menambah dukungan operator ? dalam fungsi fn main() , #[test] dan tes dokumentasi, yang memungkinkan mereka mengembalikan Option<T> atau Result<T, E> mana opsi dengan kesalahan menghasilkan kode terminasi yang tidak nol dalam kasus fn main() atau tes yang jatuh dalam kasus tes .


Dukungan dalam fn main() dan #[test] diimplementasikan untuk waktu yang lama . Namun, dukungan dalam tes dokumentasi terbatas pada tes di mana fn main() hadir secara eksplisit.


? dukungan penuh ditambahkan dalam rilis ini ? dalam tes dokumentasi. Sekarang Anda dapat menulis dalam tes dokumentasi Anda ini:


 /// ```rust /// use std::io; /// let mut input = String::new(); /// io::stdin().read_line(&mut input)?; /// # Ok::<(), io:Error>(()) /// ``` fn my_func() {} 

Di bagian bawah tes dokumentasi, Anda masih perlu menunjukkan jenis kesalahan yang akan digunakan.


Dukungan untuk aliran token khusus dalam atribut pengguna


Makro prosedural di Rust dapat mendefinisikan atribut pengguna yang mereka gunakan. Sampai sekarang, atribut-atribut ini telah terbatas pada path tree dan literal sesuai dengan sintaks berikut:


 #[foo(bar)] #[foo = "bar"] #[foo = 0] #[foo(bar = true)] #[foo(bar, baz(quux, foo = "bar"))] 

Tidak seperti macro prosedural, atribut tambahan ini tidak dapat menerima aliran token yang sewenang-wenang di pembatas, itulah sebabnya Anda tidak bisa menulis #[range(0..10)] atau #[bound(T: MyTrait)] . Racks dari macro prosedural malah menggunakan string untuk sintaksis seperti ini, misalnya #[range("0..10")] .


Dengan rilis ini, atribut khusus #[attr($tokens)] memungkinkan penggunaan token sewenang - wenang dalam $tokens , cocok dengan mereka sesuai dengan makro. Jika Anda adalah penulis peti makro prosedural, harap periksa apakah string digunakan dalam sintaks atribut pengguna Anda dan apakah string dapat diganti dengan aliran token.


TryFrom dan TryInto


Sifat TryFrom dan TryInto telah distabilkan untuk mendukung kesalahan konversi tipe.


Misalnya, from_be_bytes dan metode terkait tipe integer menerima array, tetapi data sering dibaca melalui irisan. Konversi manual antara irisan dan array sangat membosankan. Dengan sifat-sifat baru, ini dapat dilakukan pada baris yang sama dengan .try_into() .


 let num = u32::from_be_bytes(slice.try_into()?); 

Untuk konversi yang tidak dapat gagal, seperti u8 ke u32 , tipe Infallible ditambahkan. Karena itu, TryFrom secara otomatis diterapkan untuk semua yang menerapkan sifat From . Di masa mendatang, kami berharap dapat membuat Infallible alias untuk ! (tidak pernah) .


fn before_exec digunakan lagi karena unsafe fn pre_exec


Pada sistem mirip Unix, CommandExt::before_exec memungkinkan Anda untuk menjadwalkan penutupan sebelum exec dipanggil.


Penutupan ini dilakukan dalam konteks proses anak setelah garpu. Ini berarti bahwa sumber daya, seperti deskriptor file dan area memori, dapat digandakan. Dengan kata lain, Anda bisa mendapatkan salinan nilai jenis non- Copy dalam proses yang berbeda, sedangkan yang asli akan tetap di induknya. Ini dapat menyebabkan perilaku yang tidak terdefinisi dan merusak perpustakaan yang menyarankan tidak adanya duplikasi .


Oleh karena itu, fungsi before_exec harus ditandai unsafe . Dalam rilis ini, kami menandai fn before_exec tidak digunakan lagi karena unsafe fn pre_exec . Saat memanggil CommandExt::pre_exec Anda perlu memastikan bahwa penutupan tidak melanggar invarian perpustakaan dengan membuat duplikat yang tidak valid. Jika Anda menyediakan perpustakaan yang berada dalam situasi yang sama before_exec , pikirkan tentang keusangan dan berikan alternatif dengan unsafe .


Stabilisasi perpustakaan


Dalam 1.34.0, himpunan bilangan bulat atom tipe bertanda dan tidak bertanda diperluas diperluas, dimulai dengan 8 bit ( AtomicU8 ) dan berakhir dengan 64 bit.


NonZeroU8 unsigned integer seperti NonZeroU8 sebelumnya distabilkan. Berkat ini, Option<NonZeroU8> berukuran sama dengan u8 . Versi yang ditandatangani seperti NonZeroI8 distabilkan dalam rilis ini.


Fungsi iter::from_fn dan iter::successors distabilkan. Yang pertama memungkinkan Anda membuat iterator dari FnMut() -> Option<T> . Untuk mengambil elemen berulang-ulang dari vektor, Anda sekarang dapat menulis from_fn(|| vec.pop()) . Sementara itu, fungsi kedua menciptakan iterator baru, di mana setiap elemen selanjutnya dihitung berdasarkan yang sebelumnya.


Selain itu, API berikut telah distabilkan:



Lihat catatan rilis terperinci untuk detail lebih lanjut.

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


All Articles