Tim pengembangan Rust dengan bangga mengumumkan rilis versi baru, 1.38.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.38.0 Anda hanya perlu menjalankan perintah berikut:
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?
Sorotan dari rilis ini adalah kompilasi pipelined.
Kompilasi pipa
Kompilator tidak perlu dependensi yang dirakit sepenuhnya untuk membangun paket, tetapi hanya "metadata" mereka (daftar jenis, dependensi, ekspor, dll.) Yang dihasilkan pada tahap awal kompilasi. Dimulai dengan Rust 1.38.0, Cargo akan segera mulai membangun paket tergantung begitu metadata mereka tersedia.
Waktu pembuatan satu paket tidak berkurang, tetapi pengujian kami menunjukkan bahwa kecepatan kompilasi meningkat 10% -20% dalam kasus build optimal (di mana beberapa dependensi sudah dikompilasi). Untuk paket lain, peningkatan kecepatan kompilasi yang kuat tidak terjadi. Waktu yang dibutuhkan untuk membangun paket tergantung pada komputer, sehingga kinerjanya dapat bervariasi. Kompilasi pipa diaktifkan secara otomatis dari versi 1.38.0.
Memeriksa beberapa penyalahgunaan mem::{uninitialized, zeroed}
Seperti yang diumumkan sebelumnya , std::mem::uninitialized
tidak direkomendasikan. Sebaliknya, MaybeUninit<T>
harus digunakan.
Fungsi mem::uninitialized
belum ditinggalkan, tetapi ini akan dilakukan dalam rilis mendatang. Tetapi meskipun demikian, mulai dari 1.38.0, rustc memeriksa kelas sempit inisialisasi yang salah menggunakan mem::uninitialized
atau mem::zeroed
.
Untuk beberapa jenis, seperti &T
dan Box<T>
, nilai nol dianggap sebagai perilaku tidak terdefinisi, karena mereka adalah objek seperti pointer yang tidak boleh null
. Ini akan menjadi kesalahan untuk menggunakan mem::uninitialized
atau mem::zeroed
untuk menginisialisasi jenis ini, jadi kompiler akan mencoba memperingatkan Anda jika ada fungsi-fungsi ini digunakan untuk menginisialisasi objek di atas, dan tidak masalah apakah mereka diinisialisasi secara langsung atau sebagai bidang struktur besar. Pemeriksaan ini bersifat rekursif, jadi kode berikut ini berisi peringatan:
struct Wrap<T>(T); struct Outer(Wrap<Wrap<Wrap<Box<i32>>>>); struct CannotBeZero { outer: Outer, foo: i32, bar: f32 } ... let bad_value: CannotBeZero = unsafe { std::mem::uninitialized() };
Pembaca yang penuh perhatian mungkin memperhatikan bahwa perpustakaan standar berisi lebih banyak tipe yang tidak boleh diisi dengan nol, terutama NonNull<T>
dan NonZero<T>
. Sejauh ini, inisialisasi struktur ini dengan mem::uninitialized
atau mem::zeroed
belum diverifikasi.
Pemeriksaan ini tidak mencakup semua kasus penggunaan mem::uninitialized
atau mem::zeroed
, tetapi memungkinkan Anda mendeteksi kode yang salah dijamin yang harus beralih ke MaybeUninit
.
#[deprecated]
untuk makro
Atribut #[deprecated]
, pertama kali diperkenalkan di Rust 1.9.0, memungkinkan pembuat paket untuk memberi tahu pengguna tentang fungsionalitas yang sudah usang yang mereka berencana untuk hapus dalam rilis mendatang. Karat 1.38.0 memungkinkan Anda untuk menerapkan atribut ini ke makro.
std::any::type_name
Representasi string dari tipe yang digunakan mungkin diperlukan saat men-debug kode. Misalnya, di dalam tubuh fungsi generik, Anda mungkin ingin mencetak jenis argumen yang diteruskan. Sekarang ini std::any::type_name
dengan std::any::type_name
:
fn gen_value<T: Default>() -> T { println!("Initializing an instance of {}", std::any::type_name::<T>()); Default::default() } fn main() { let _: i32 = gen_value(); let _: String = gen_value(); }
Hasil:
Initializing an instance of i32 Initializing an instance of alloc::string::String
Seperti semua fungsi pustaka standar, hanya ditujukan untuk debugging, fungsi ini tidak menjamin konten dan format string yang tepat. Nilai kembali adalah deskripsi terbaik dari tipe; beberapa tipe dapat direpresentasikan dengan type_name
sama, tetapi bisa berubah di versi kompiler yang akan datang.
Perubahan ke Perpustakaan Standar
Selain itu, beberapa fungsi telah distabilkan:
Perubahan lainnya
Sintaks , manajer paket kargo, dan penganalisa Clippy juga telah mengalami beberapa perubahan.
Anggota 1.38.0
Banyak orang datang bersama untuk membuat Rust 1.38.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 diterjemahkan bersama oleh andreevlex , nlinker , funkill , dan Gymmasssorla .