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:
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 => { }
Sebagai gantinya, paket lain sekarang harus mempertimbangkan kemungkinan opsi enumerasi baru, misalnya, menambahkan _
wildcard:
match ordering { Relaxed | Release | Acquire | AcqRel | SeqCst => { } _ => { }
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]
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:
todo!()
Versi makro yang lebih pendek, lebih mudah diingat, dan lebih nyaman unimplemented!()
.
slice::repeat
Membuat Vec<T>
dari pengulangan n
slice.
mem::take
Fungsi ini mengambil nilai dari tautan yang dapat diubah dan menggantinya dengan nilai default untuk jenis ini. Ini mirip dengan Option::take
dan Cell::take
dan merupakan singkatan yang mudah digunakan untuk mem::replace(&mut dst, Default::default())
.
BTreeMap::get_key_value
dan HashMap::get_key_value
Mengembalikan pasangan nilai kunci yang cocok dengan kunci yang disediakan.
Option::as_deref
, Option::as_deref_mut
Mereka bekerja mirip dengan Option::as_ref
dan Option::as_mut
, tetapi masing-masing menggunakan Deref
dan DerefMut
jadi opt_box.as_deref()
dan opt_box.as_deref_mut()
, di mana opt_box: Option<Box<T>>
, buat Option<&T>
dan Option<&mut T>
masing-masing.
Option::flatten
Fungsi ini, seperti Iterator::flatten
, memperluas Option<Option<T>>
ke Option<T>
, menghasilkan Some(x)
untuk Some(Some(x))
dan None
sebaliknya.
UdpSocket::peer_addr
Mengembalikan alamat host jarak jauh yang terhubung dengan soket.
{f32,f64}::to_be_bytes
, {f32,f64}::to_le_bytes
, {f32,f64}::to_ne_bytes
, {f32,f64}::from_be_bytes
, {f32,f64}::from_le_bytes
dan {f32,f64}::from_ne_bytes
Mengembalikan representasi memori dari angka floating point sebagai array byte dengan big-endian (jaringan), little-endian, atau urutan byte asli-endian.
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 .