Rust 1.96.0 duyuruldu
(blog.rust-lang.org)- Rust 1.96.0
rustup update stableile kurulabilir; gelecekteki sürüm doğrulamalarına beta/nightly kanallarında katılmak mümkündür - Yeni
core::range::Range*türleri,Iteratoryerine IntoIterator uygular; bu sayedeCopyuygulanabilir ve gelecekte aralık sözdiziminin varsayılan türleri olmaları planlanır - assert_matches! ve
debug_assert_matches!, desen eşleşmediğinde değerinDebuggösterimini de yazdırarak test hatalarının teşhisini kolaylaştırır - WebAssembly hedefleri artık varsayılan olarak
--allow-undefinedgeçmediği için tanımsız semboller import yerine bağlayıcı hatasına dönüşür - Cargo, üçüncü taraf registry kullanıcıları için CVE-2026-5223 ve
CVE-2026-5222düzeltmelerini içerir; crates.io kullanıcıları etkilenmez
Rust 1.96.0'daki başlıca değişiklikler
-
Güncelleme ve test kanalları
- Rust'ı
rustupile kurmuş mevcut kullanıcılar,rustup update stableile Rust 1.96.0 sürümünü alabilir rustupyoksa Rust web sitesindekirustupkurulum sayfasından kurulabilir; ayrıca1.96.0 ayrıntılı sürüm notlarıda yayımlandı- Gelecekteki sürüm doğrulamalarına katılmak için
rustup default betaveyarustup default nightlyile beta/nightly kanalları kullanılabilir; hatalar da Rust issue tracker üzerinden bildirilebilir
- Rust'ı
-
Yeni
Range*türleri- Mevcut
Rangeve ilişkilicore::opstürlerinde birçok kullanıcıCopybeklese de, bu türler doğrudanIteratoruyguladıkları içinCopyile birlikte uygulanmamıştı - Aynı türde hem
Iteratorhem deCopyuygulamak, Clippy'nin footgun olarak işaret ettiği bir yaklaşım olduğu için bundan kaçınılıyordu - RFC3550,
IteratoryerineIntoIteratoruygulayan alternatif aralık türleri önerdi; bu yapıda ilgili türlerCopyde uygulayabilir - Standart kütüphanede
core::range::Range,core::range::RangeFrom,core::range::RangeInclusiveve ilişkili iterator'lar stabilize edildi - Yakın gelecekteki Rust sürümlerine,
core::opsiçinden yeniden dışa aktarılancore::range::RangeFullvecore::range::RangeToile mevcut aralık türlerinin yeni konumu olacakcore::range::legacy::*de eklenecek 0..1gibi aralık sözdizimi şu anda legacy türler üretse de, gelecekteki bir edition'dacore::rangetürlerine geçecek- Bu yeni stabilizasyon sayesinde
startveendayırmadan slice erişicileriCopytürlerinde saklamak mümkün hale geliyor - Örnek:
use core::range::Range; #[derive(Clone, Copy)] pub struct Span(Range<usize>); impl Span { pub fn of(self, s: &str) -> &str { &s[self.0] } } - Yeni
RangeInclusive, alanlarını herkese açık yapar; çünkü legacy sürümde olduğu gibi tüketilmiş iterator durumunu dışa vurma riskinden kaçınmak gerekmez - Yeni türlerde iterasyona başlamak için önce dönüşüm gerektiğinden, açık alanlar sorun oluşturmaz
- Kütüphane yazarları, herkese açık API'lerde hem legacy hem de yeni aralık türlerini kabul eden
impl RangeBoundskullanımını değerlendirmelidir - Somut bir tür gerekiyorsa, gelecekte varsayılan olacak yeni aralık türlerini tercih etmek önerilir
- Mevcut
-
Desen eşleme assertion makroları
- Yeni
assert_matches!vedebug_assert_matches!makroları, bir değerin verilen desenle eşleşip eşleşmediğini denetler; eşleşmezse değerinDebuggösterimiyle birlikte panic üretir - Bu iki makro özünde
assert!(matches!(..))vedebug_assert!(matches!(..))ile aynıdır; ancak hata durumunda yazdırılan değer sayesinde teşhis edilebilirlik artar - Aynı adı sağlayan popüler üçüncü taraf crate'lerle çakışma yaratabileceği için standart prelude'a eklenmedi
- Kullanmadan önce doğrudan
coreveyastdiçinden içe aktarılmaları gerekir - Örnek:
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); }
- Yeni
-
WebAssembly hedeflerindeki değişiklik
- WebAssembly hedefleri artık bağlayıcıya
--allow-undefinedgeçmiyor - Bağlama sırasında oluşan tanımsız semboller,
"env"modülünün WebAssembly import'una dönüştürülmek yerine bağlayıcı hatası oluşturuyor - Bağlamayla ilgili tüm semboller tanımlı değilse modül hiç bağlanmayacağından, bu değişiklik hataları daha erken yakalamayı ve sembol adları gibi konulardaki kazara sorunları önlemeyi sağlıyor
- Tanımsız bağlama sembolleri genellikle derleme zamanı hatası veya yapılandırma yanlışlığına işaret eder
- Eski davranış kasıtlıysa
RUSTFLAGS=-Clink-arg=--allow-undefinedile geri dönülebilir ya da kaynak kodda sembolü tanımlayan blokta#[link(wasm_import_module = "env")]kullanılabilir - Bu değişiklik, önceki blog duyurusunun ardından Rust 1.96 ile devreye alındı
- WebAssembly hedefleri artık bağlayıcıya
Stabilize edilen API'ler ve güvenlik düzeltmeleri
-
Stabilize edilen API'ler
-
Cargo için 2 güvenlik tavsiyesi
- Rust 1.96, üçüncü taraf registry kullanıcıları için iki Cargo açığına yönelik düzeltmeler içerir
- CVE-2026-5223, sembolik bağlantı içeren crate tarball'larının çıkarılmasıyla ilgili orta şiddette bir güvenlik açığıdır
- CVE-2026-5222, normalize edilmiş URL üzerinden kimlik doğrulamayla ilgili düşük şiddette bir güvenlik açığıdır
- crates.io kullanıcıları bu iki açıktan da etkilenmez
-
Ek değişiklikler
1 yorum
Lobste.rs yorumları
assert_matchesi hep istemeye devam ediyorum ama her seferinde yeni bir crate ekleyip eklememek ya da kendim yeniden yazıp yazmamak arasında kalıyorumBu yüzden standart kütüphaneye girmesi sevindirici.
Aralıkların
Copytipi haline getirilmesine yönelik adımı beğendimBazen bir aralığı klonlamam gerektiğine şaşırmıştım; ayrıca
12..34ifadesinin küçük ve kopyalanabilir bir veri olması gerektiği yönündeki sezgiyle de daha uyumlu.Yine de aynı ada sahip birden fazla tip olursa, VS Code bir dahaki sefere
usebildirimini otomatik eklediğinde yanlış tipi içe aktarır mı diye biraz endişeleniyorum.Çoğu kullanıcı için yeni tiplerin faydası küçük; bu yüzden mevcut tipleri kullanmaya devam edebilirler ve bir sonraki edition sınırında yeni tipler otomatik olarak kullanılmaya başlanır.
Muhtemelen tipleri özellikle içe aktaracak olanlar, her iki sürümü de açıkça desteklemek isteyen kütüphane yazarları olacaktır.
Mevcut projeleri bozmadan prelude'u değiştirebilirsiniz.