Ulaşım
- Adres: 2342 Sk, İpekyol, İpek Ap 49A, 63250 Haliliye/Şanlıurfa
- Telefon:
0505 532 36 38 - eMail: admin@alestaweb.com
Rust ekosistemi 20 Şubat 2025'te kritik bir kilometre taşına ulaştı: Rust 1.85 yayınlandı ve uzun zamandır beklenen 2024 Edition stable oldu. Bu, son 3 yılda Rust'a gelen en büyük edition değişikliği. Async closures (async || {}) artık stable, gen blocks ile iteratör üretimi basit, Future ve IntoFuture prelude'a girdi, style editions ile formatting özelleştirilebilir hale geldi. Alesta Web olarak bu rehberde Rust 2024 Edition'ı detaylıca inceliyoruz.
Rust dilinin edition kavramı, geriye dönük uyumluluğu (backward compatibility) bozmadan dile büyük değişiklikler getirmek için kullanılan bir mekanizma. Üç edition var şu ana kadar: 2015, 2018, 2021. Şubat 2025'te Rust 2024 Edition stable oldu — son 3 yılın en kapsamlı sürümü (most significant in 3 years).
Önemli not: Edition yeni dil özelliği eklemez, mevcut özelliklerin syntax'ını veya davranışını değiştirebilir. Her crate kendi edition'ını seçer (edition = "2024" Cargo.toml'da). 2015 edition crate'i, 2024 edition crate'i ile sorunsuz çalışır.
2015 (1.0 release) → 2018 (async/await, modules) → 2021 (closure captures, IntoIterator for arrays) → 2024 (async closures, gen blocks, IntoFuture prelude). Alesta Web projelerimizin %85'i artık 2024 edition'da.
Yıllardır Rust ekosisteminde async kod yazarken karşılaştığımız büyük bir gap vardı: async closures. Şimdiye kadar FnMut, FnOnce traitler async fonksiyonları temiz şekilde destekleyemiyordu. Rust 1.85 ile bu çözüldü.
// ÖNCEDEN (Rust 2021): Workaround gerekiyordu
async fn process_items<F>(items: Vec<i32>, f: F)
where
F: Fn(i32) -> Pin<Box<dyn Future<Output = i32> + Send>>,
{
for item in items {
let result = f(item).await;
println!("{}", result);
}
}
// ŞİMDİ (Rust 2024): Native syntax
async fn process_items<F>(items: Vec<i32>, f: F)
where
F: AsyncFn(i32) -> i32,
{
for item in items {
let result = f(item).await;
println!("{}", result);
}
}
// Kullanım: async closure ile
process_items(vec![1, 2, 3], async |x| x * 2).await;
Yeni traitler:
AsyncFn — async closure'lar içinAsyncFnMut — mutable state ile async closuresAsyncFnOnce — bir kere çağrılabilir async closuresBu traitler local environment'tan değer capture edebilir, lifetime'lar düzgün çıkarılabilir (lifetimes properly inferred).
Alesta Web ekibi olarak bir async stream processing pipeline'ını refactor ederken kod miktarımız ~%40 azaldı. Pin<Box<dyn Future>> gibi karmaşık tip notasyonları kayboldu, kod okunabilirliği inanılmaz arttı.
Python'da yield, JavaScript'te function* kullanarak iterator yazmak çok kolaydır. Rust'ta ise iterator implement etmek için Iterator trait'ini implement etmek, next() metodunu yazmak, state machine'i elle kurmak gerekiyordu. Rust 2024 Edition ile gen blocks bu sorunu çözüyor.
// ÖNCEDEN: Iterator trait implementation
struct Fibonacci { a: u64, b: u64 }
impl Iterator for Fibonacci {
type Item = u64;
fn next(&mut self) -> Option<Self::Item> {
let result = self.a;
let next = self.a + self.b;
self.a = self.b;
self.b = next;
Some(result)
}
}
// ŞİMDİ (gen block ile)
fn fibonacci() -> impl Iterator<Item = u64> {
gen {
let (mut a, mut b) = (0u64, 1u64);
loop {
yield a;
let next = a + b;
a = b;
b = next;
}
}
}
// Kullanım
let fib: Vec<u64> = fibonacci().take(10).collect();
// [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
gen block'ların avantajları:
Alesta Web notu: gen block'lar özellikle recursive iterator, state machine veya complex traversal gerektiren algoritmalarda inanılmaz işe yarıyor. Tree traversal yazarken hayat kurtarıyor.
Rust 2024 Edition öncesinde async kod yazarken sık sık use std::future::Future; ve use std::future::IntoFuture; import etmek gerekiyordu. 2024 Edition ile bu traitler prelude'a (default import) eklendi.
// Rust 2021
use std::future::Future;
use std::future::IntoFuture;
async fn fetch<T: IntoFuture<Output = String>>(req: T) -> String {
req.await
}
// Rust 2024 - import gerek yok!
async fn fetch<T: IntoFuture<Output = String>>(req: T) -> String {
req.await
}
Bu küçük gibi görünen değişiklik aslında büyük kalite-yaşam (quality-of-life) iyileştirmesi. Async kod yazarken use satırlarının kalabalığı azalıyor.
Rust 2024 Edition ile birlikte style editions kavramı tanıtıldı. Bu, formatting kurallarını edition'dan bağımsız olarak özelleştirme imkanı veriyor. Yani edition = "2024" kullansanız bile, formatting için style_edition = "2021" tercih edebilirsiniz.
# Edition: dilin syntax kuralları edition = "2024" # Style: rustfmt'nin formatting kuralları (2024'te değişiklik var) style_edition = "2024" # Veya geriye uyumlu kalmak için # style_edition = "2021"
Hangi formatting değişiklikleri var?
Alesta Web önerisi: Büyük codebase'lerde style edition'ı edition geçişinden ayrı yapın. Önce edition'a geçin, formatting'i bir sonraki PR'da değiştirin. CR (code review) yükünü azaltır.
Cargo artık Cargo.toml'daki rust-version alanını dependency resolution sırasında dikkate alıyor. Eğer bir crate sizden daha yeni Rust sürümü gerektiriyorsa, Cargo otomatik olarak uyumlu bir eski sürümü seçiyor.
[package]
name = "my-app"
version = "0.1.0"
edition = "2024"
rust-version = "1.82" # En düşük desteklenen Rust sürümü
[dependencies]
serde = "1.0" # Cargo, 1.82 ile uyumlu en yeni sürümü seçer
tokio = { version = "1", features = ["full"] }
Bu özellik özellikle library yazarları için kritik. MSRV (Minimum Supported Rust Version) garanti edebiliyorsunuz, kullanıcılarınız onlara uyumlu sürümleri otomatik alıyor.
Eski Cargo sürümleri (