Programlama Dili: Rust 2024 şimdiye kadarki en büyük baskı

Saberie

Active member
Şubat 2025'in sonunda, Rust 1.85 ve dolayısıyla Rust Edition 2024. Bunu anlamak kolay değil, neden bir sürümün yanı sıra bir sürüm var ve neden buna ihtiyacınız var? Her şeyden önce, bir tanıtım açıklaması gereklidir: Sürüm, sürüm? Ne hakkında?










Stefan Baumgartner bir yazılım mimarı ve geliştiricidir. TypeScript, Rust, React ve Yazılım Mühendisliği üzerine makaleler, öğreticiler ve rehberler yazıyor ve OIDA.DEV'de eğitim sunuyor.







Rust 1.0 on yıl önce ortaya çıktığında, buna bir vaat eşlik etti: Derleyici, 1.0 sürümüyle yazılmış her kodu geçerli pas versiyonlarıyla çevirebilmelidir. Dolayısıyla, uyumluluğu tehlikeye atan veya parçalayan hiçbir değişiklik olmamalıdır. Dil son yıllarda önemli ölçüde geliştiğinden, değişikliklerin bozulmasından kaçınılamaz.

Harika değişiklikler için sürümler


Pas, baskılar aracılığıyla bu otomatik sınırlamayı atlar. Dil ve standart kütüphane sürümden sürüme gelişir ve uyumluluk anlamında aşağı doğru yeni özellikler eklerken, sürümler onaydan sonra bozuk uyumluluğa izin verir. Sürümü seçerek, geliştiriciler Rust ekosisteminin mevcut anlayışına dayanan bir proje başlatabilir veya yarı otomatik olarak mevcut bir projeyi taşıyabilir.

Sürümler arasındaki değişiklikler derin olabilir. Bir örnek, 2015 baskısında fleksik olmayan yaşamların tanıtımı ile Central Borrow Checker'daki değişiklikler. Bugün, bu işlev esastır. 2018 baskısında anahtar kelimelere daha ince ekleme var async VE await. Uyumluluk açısından aşağıya doğru, bu anahtar kelimeleri değişkenler veya sürekli işlevler için bir tanımlayıcı olarak kullanan mevcut kodun çalışması garanti edilmelidir. Buna ek olarak, modül sistemi gerçek kullanımdaki gereksinimleri karşılamak için sıkı ve modernize edilmiştir. Rust 2021, daha önce uyarılar, küresel alanda yeni özellikler ve türler, makrosyventass uzantıları ve yaşam kalitesindeki diğer iyileştirmeler olan hatalar içerir.

Baskı kavramı Rust ile kalkınma için bir nimettir. O zamanlar Python 3'teki Python 2'den sıçrayan herkes genellikle ekosistemin bölünmesini hatırlıyor.

2024 baskısının en iyisi




Sürümün sürüşü gösterildiği gibi, 2024 baskısındaki değişiklikler genişletilir ve dilde değişikliklerden eşyalardaki yaşam kalitesi işlevselliğine, standart kütüphaneden güncellemelere kadar geçer.

Değişikliğin değişmesi, ayrılmış sözdizimi ve anahtar kelimeler gibi küçük ayarlamalar içerdiğinden, aynı zamanda bir makalenin tamamını haklı çıkaracak özellikler içerdiğinden, esas olarak gelişimi neyin etkilediğine odaklanan en iyi seçilen en iyi listeyi takip eder.

Geçici geçerlilik alanları


Sürüm 1.0 sürümünde sürüm ile, flexal olmayan süreye dayalı borç denetleyicisi zaten geliştirme goomy'sinde bir vahiydi, ancak kodun mülkü ve kredi modelini takip ettiği küçük mantıksal hatalardan korunmuyor, ancak beklenmedik davranışlar için diğer koşullara neden oluyor.

Aşağıdaki işlev, bir RwLock Başından sonuna kadar. Sonuçta ReadLock Bir seçenek içerir if let-Nipacked ve içindeki değerle çalışır. Bu değer yoksa, istersiniz else-Durumun bir değeri RwLock Sonra kendinizi yazmaya erişimden geçirin.



fn f(value: &RwLock<Option<bool>>) {
if let Some(x) = *value.read().unwrap() {
println!("value is {x}");
} else {
let mut v = value.write().unwrap();
if v.is_none() {
*v = Some(true);
}
}
// <--- Read lock is dropped here in 2021
}



Basım 2021'de bu bunu yapacak RwLock Sadece tüm IF-ELSE eğitiminin sonunda bitirdi ve iptal edildi. Program başka daldayken blok hala var olduğundan, yazmaya erişime izin verilmez. Pust 2021'e kadar, bu kod bir durak oluşturacak ve sonunda süresiz olarak bekleyecektir.

Pust 2024, bu unsurların süresini IF eğitimin geçici alanına düşürür. Bu, sonbahar çağrısının diğer şubenin önünde zaman olduğu anlamına gelir:



fn f(value: &RwLock<Option<bool>>) {
if let Some(x) = *value.read().unwrap() {
println!("value is {x}");
}
// <--- Read lock is dropped here in 2024
else {
let mut s = value.write().unwrap();
if s.is_none() {
*s = Some(true);
}
}
}


Bir bloğun sonunda veya bir fonksiyon veya kapanma alanında değerlendirilen ifadeler için – kuyruğun ifadesi – geçici alan da kısalır. RFC 3606 (yorum isteği) bunu aşağıdaki grafikte çok net bir şekilde gösterir.








Kuyruğun ekspresyonu için geçici alan kısaltılır (Şekil 1).


(Resim: Rust Foundation)



Bu, bir sonuç oluşturmak için hala bir değerin sahibinin hala gerekli olduğu sorunlu durumları çözer:



// Before 2024
fn f() -> usize {
let c = RefCell::new("..");
c.borrow().len() // error[E0597]: `c` does not live long enough
}



c.borrow() erişimin geçici bir değer yaratır c Ha. Orada c Bu geçici değer Rust 2021'de erişilemeden önce ortadan kaldırılır len Öte yandan, Rust 2024'te izin verildi.

Güvensiz Değişiklikler


Muhtemelen pastaki en yanlış anlaşılan güvenlik işlevselliği unsafeAyrıca çok hoş bir değişiklik var.

Anahtar kelime unsafe İki aktivite için mevcuttur: Bir işlevin önek olarak, daha fazla kontrol olmadan belirsiz davranışlara yol açabilecek bir işlem rapor eder. Bir unsafe Soğuk blok böyle bir işlevi yerine getirebilir.

Ancak şimdiye kadar her şey işaretli bir blok içinde otomatikti unsafe: Yapabilirdin unsafe Daha fazla gecikmeden beyan edilen işlemleri arayın.



unsafe fn get_unchecked<T>(x: &[T], i: usize) -> &T {
x.get_unchecked(i)
}



Bu davranış uzun zamandır eleştirildi çünkü bir yandan eleştirel görüşleri keşfetmek zor ve diğer yandan unsafe Bir önek olarak, bloktaki bir çağrının çağrısının örtük olmaktan uzaktır. unsafe-İşlev. Örneğin, vektör uzunluğunu değiştirmek tamamen güvenli olabilir, ancak yan etkilere neden olabilir.

Rust 2024 bu davranışı tamamen kaldırmaz, ancak en azından bir uygulama ise bir uyarı oluşturur unsafe-İçerideki Fonksiyonlar unsafe-Fonksiyonlar olmadan unsafe-Blok performans gösterir. Blokta paketlendikten sonra uyarı tekrar kaybolur:



unsafe fn get_unchecked<T>(x: &[T], i: usize) -> &T {
unsafe { x.get_unchecked(i) }
}



Rust ayrıca Rust 2024'te herkesin extern-örneğin arayüz olarak hareket eden blok, aynı zamanda unsafe İlan edilirler. Bu gerçek anlamını gösterir unsafe: Geçerliliği derleyiciyi kontrol etmeyen, ancak kodu yazarken göz kulak olmanız gereken şeyleri puanlar.

Aynı nedenlerle, özellikler link_section,, export_name VE no_mangle GİBİ unsafe işaretlenmiş. Standart kütüphaneden işlevler env::set_var VE env::get_var Rust 2024 ayrıca çevre değişkenlerinin okunması ve yazılması meselesi olarak davranır unsafe.

Bu alanın özellikle bu kadar çok güncelleme alması, bunun ne kadar önemli olduğunu göstermektedir. unsafe güvenlik özellikleri olarak. Özel web sitemdeki konu ve sayısız yanlış anlamalar hakkında daha fazla ayrıntı hazırladım.

Kutu yineleyicileri


Pasta, dilimler bir dizi elementin bir görünümünü temsil eder. Bu şekilde dizi ve taşıyıcılar arasında ortak bir payda oluştururlar ve farklı veri türleri için yöntemler, işlevler ve özellikler uygulamanıza izin verirler. Çoğu zaman dilimleri referans formunda yönetirsiniz: Vec<T> Mülk türü verdiğinde, &[T] Dilim.

Bununla birlikte, bazı senaryolarda başka bir dilim türü vardır: konserve dilimler (Box<[T]>) Kimden başka bir şey söylemez: İşte bir dizide bir işaretçi. Bu tür, referansların aksine, değişkenlerin sahipliğini ilişkilendirmenizi sağlayan bir özellik türüdür.

Aşağıdaki öğelerin dizilerine erişmek için bölüm, IntoIterator gerekli.

1.80'den önceki pas versiyonlarında IntoIterator değil Box<[T]> uygulandı. Arama .into_iter() gevşeme Box<[T]> İLE &[T] AÇIK. Tüm öğeler referanslardır, ör. &TBir tür mülk için arzu edilmeyen şey.



// Vor Rust 2021
let my_boxed_slice: Box<[u32]> = vec![1, 2, 3].into_boxed_slice();
// .into_iter() war notwendig vor Rust 1.80
for x in my_boxed_slice.into_iter() {
// x ist vom Typ &u32
}



Rust 1.80 bir uygulamayı getirdi IntoIterator İçin Box<[T]>Bununla birlikte, yalnızca yineleyiciyi sözdizimi şekeri aracılığıyla aldıysanız ulaştı. Döngüler için, açık çağrısından farklı into_iter() Olumsuz.



// Rust 1.80, alle Editionen
let my_boxed_slice: Box<[u32]> = vec![1, 2, 3].into_boxed_slice();
for x in my_boxed_slice {
// x ist vom Typ u32
}


Rust 2024'te davranış aynı şeyi çeker: into_iter() Şimdi doğru uygulamayı alın ve ayrıca T element için – ve daha fazla &T.



// Rust 2024
let my_boxed_slice: Box<[u32]> = vec![1, 2, 3].into_boxed_slice();
for x in my_boxed_slice.into_iter() {
// x ist vom Typ u32
}




Ne yazık ki, bu bağlantı artık geçerli değil.

Boşa harcanan eşyalara bağlantılar, 7 günlük daha büyükse veya çok sık çağrılmışsa gerçekleşmez.


Bu makaleyi okumak için bir Haberler+ paketine ihtiyacınız var. Şimdi yükümlülük olmadan bir hafta deneyin – yükümlülük olmadan!
 
Üst