Rust 1.96.0 diumumkan
(blog.rust-lang.org)- Rust 1.96.0 dapat diinstal dengan
rustup update stable, dan verifikasi rilis mendatang bisa diikuti melalui kanal beta/nightly - Tipe baru
core::range::Range*mengimplementasikan IntoIterator alih-alihIterator, sehingga bisa mengimplementasikanCopydan ke depannya akan menjadi tipe bawaan untuk sintaks rentang - assert_matches! dan
debug_assert_matches!menampilkan representasiDebugdari nilai saat pola tidak cocok, sehingga diagnosis kegagalan pengujian menjadi lebih mudah - Target WebAssembly tidak lagi meneruskan
--allow-undefinedsecara default, sehingga simbol yang tidak terdefinisi menjadi error linker, bukan import - Cargo mencakup perbaikan untuk CVE-2026-5223 dan
CVE-2026-5222bagi pengguna registry pihak ketiga, dan pengguna crates.io tidak terdampak
Perubahan utama di Rust 1.96.0
-
Pembaruan dan kanal pengujian
- Pengguna yang memasang Rust yang ada melalui
rustupbisa mendapatkan Rust 1.96.0 denganrustup update stable - Jika belum memiliki
rustup, Anda dapat menginstalnya dari halaman instalasirustupdi situs Rust, dan catatan rilis terperinci 1.96.0 juga telah dipublikasikan - Untuk berpartisipasi dalam verifikasi rilis mendatang, Anda dapat menggunakan kanal beta/nightly dengan
rustup default betaataurustup default nightly, dan bug dapat dilaporkan ke pelacak isu Rust
- Pengguna yang memasang Rust yang ada melalui
-
Tipe
Range*baruRangelama dan tipe terkait dicore::opsselama ini diharapkan banyak pengguna sebagaiCopy, tetapi tidak mengimplementasikannya karena secara langsung mengimplementasikanIterator- Mengimplementasikan
IteratordanCopypada tipe yang sama adalah footgun yang disorot oleh Clippy, sehingga sebelumnya dihindari - RFC3550 mengusulkan tipe rentang alternatif yang mengimplementasikan
IntoIteratoralih-alihIterator, dan dengan struktur ini tipe-tipe tersebut juga dapat mengimplementasikanCopy - Di pustaka standar,
core::range::Range,core::range::RangeFrom,core::range::RangeInclusivebeserta iterator terkait kini telah distabilkan - Dalam versi Rust yang akan datang,
core::range::RangeFulldancore::range::RangeToyang diekspor ulang daricore::ops, sertacore::range::legacy::*yang akan menjadi lokasi baru bagi tipe rentang saat ini, juga akan ditambahkan - Sintaks rentang seperti
0..1saat ini masih membuat tipe legacy, tetapi dalam edisi mendatang akan berubah menjadi tipecore::range - Dengan stabilisasi baru ini, aksesori slice kini dapat disimpan dalam tipe
Copytanpa harus memisahkanstartdanend - Contoh:
use core::range::Range; #[derive(Clone, Copy)] pub struct Span(Range<usize>); impl Span { pub fn of(self, s: &str) -> &str { &s[self.0] } } RangeInclusivebaru membuka field-nya, karena tidak perlu menghindari paparan status iterator yang sudah habis seperti pada versi legacy- Tipe baru ini harus dikonversi terlebih dahulu sebelum iterasi dimulai, sehingga field publik bukan menjadi masalah
- Penulis library sebaiknya mempertimbangkan penggunaan
impl RangeBoundspada API publik agar dapat menerima baik tipe rentang legacy maupun tipe baru - Jika membutuhkan tipe konkret, disarankan untuk memilih tipe rentang baru yang nantinya akan menjadi default
-
Makro asersi pencocokan pola
- Makro baru
assert_matches!dandebug_assert_matches!memeriksa apakah sebuah nilai cocok dengan pola yang diberikan, dan jika tidak cocok akan panic sambil menampilkan representasiDebugdari nilai tersebut - Kedua makro ini pada dasarnya setara dengan
assert!(matches!(..))dandebug_assert!(matches!(..)), tetapi kemudahan diagnosis meningkat berkat nilai yang ditampilkan saat gagal - Karena bisa berbenturan dengan crate pihak ketiga populer yang menyediakan makro dengan nama sama, keduanya tidak ditambahkan ke prelude standar
- Sebelum digunakan, makro harus diimpor langsung dari
coreataustd - Contoh:
use core::assert_matches; /// [Random Number](https://xkcd.com/221/) fn get_random_number() -> u32 { // chosen by a fair dice roll. // guaranteed to be random. 4 } fn main() { assert_matches!(get_random_number(), 1..=6); }
- Makro baru
-
Perubahan pada target WebAssembly
- Target WebAssembly tidak lagi meneruskan
--allow-undefinedke linker - Saat proses linking, simbol yang tidak terdefinisi tidak lagi dikonversi menjadi import WebAssembly dari modul
"env", melainkan menjadi error linker - Jika semua simbol terkait linking harus terdefinisi agar modul dapat ditautkan, bug bisa ditemukan lebih awal dan masalah tak disengaja seperti pada nama simbol dapat dicegah
- Simbol terkait linking yang tidak terdefinisi biasanya menunjukkan bug saat build atau kesalahan konfigurasi
- Jika perilaku lama memang diinginkan, Anda dapat mengembalikannya dengan
RUSTFLAGS=-Clink-arg=--allow-undefined, atau menggunakan#[link(wasm_import_module = "env")]pada blok yang mendefinisikan simbol di kode sumber - Perubahan ini diterapkan di Rust 1.96 setelah pengumuman blog sebelumnya
- Target WebAssembly tidak lagi meneruskan
API yang distabilkan dan perbaikan keamanan
-
API yang distabilkan
-
Dua advisori keamanan Cargo
- Rust 1.96 mencakup perbaikan untuk dua kerentanan Cargo bagi pengguna registry pihak ketiga
- CVE-2026-5223 adalah kerentanan tingkat sedang yang terkait dengan ekstraksi tarball crate yang memiliki symbolic link
- CVE-2026-5222 adalah kerentanan tingkat rendah yang terkait dengan autentikasi melalui URL yang dinormalisasi
- Pengguna crates.io tidak terdampak oleh kedua kerentanan tersebut
-
Perubahan tambahan
1 komentar
Pendapat di Lobste.rs
Saya terus merasa ingin punya
assert_matches, tetapi setiap kali itu terjadi saya jadi bimbang apakah harus menambahkan crate baru atau mengimplementasikannya ulang sendiriJadi, menyenangkan melihatnya masuk ke standard library
Saya suka langkah untuk membuat range menjadi tipe
CopyKadang saya terkejut saat harus mengkloning range, dan ini juga lebih sesuai dengan intuisi bahwa
12..34seharusnya berupa data kecil yang bisa disalinNamun, kalau ada beberapa tipe dengan nama yang sama, saya agak khawatir VS Code akan mengambil tipe yang salah saat berikutnya otomatis menambahkan deklarasi
useBagi kebanyakan pengguna, manfaat tipe baru ini kecil, jadi cukup terus pakai tipe lama saja, lalu di batas edition berikutnya tipe baru akan mulai dipakai secara otomatis
Sepertinya yang terutama akan mengimpor tipe ini adalah penulis library yang ingin secara eksplisit mendukung kedua versi
Prelude bisa diubah tanpa merusak proyek yang sudah ada