Prelude’deki Değişiklikler
Özet
FutureveIntoFuturetrait’leri artık prelude’un parçasıdır.- Bu durum trait metod çağrılarını belirsiz hale getirip bazı kodların derlenememesine yol açabilir.
Ayrıntılar
Standart kütüphanenin prelude’u, her modülde
otomatik olarak içe aktarılan her şeyi içeren modüldür. Option, Vec,
drop ve Clone gibi sık kullanılan öğeleri barındırır.
Rust derleyicisi, prelude’a yapılan eklemelerin mevcut kodu bozmamasını
sağlamak için elle içe aktarılan öğelere prelude’dan gelenlerden daha yüksek
öncelik verir. Örneğin ornek adlı bir crate ya da modülünüz varsa ve içinde
pub struct Option; tanımlıysa, use ornek::*; ifadesi Option adını açıkça
ornek içindeki tipe bağlar; standart kütüphanedekine değil.
Ancak prelude’a bir trait eklemek, mevcut kodu daha ince bir şekilde bozabilir.
Örneğin BenimYoklayici trait’inden gelen x.poll() çağrısı, std içindeki
Future da içe aktarıldığında derlenmeyebilir; çünkü poll çağrısı artık
belirsiz hale gelir ve iki trait’ten de gelebilir.
Çözüm olarak Rust 2024 yeni bir prelude kullanır. Bu yeni sürüm, aşağıdaki değişiklikler dışında mevcut prelude ile aynıdır:
Taşıma
Çakışan trait metodları
Kapsamda bulunan iki trait aynı metod adına sahipse, hangi trait metodunun kullanılacağı belirsiz olur. Örneğin:
trait BenimYoklayici {
// Bu ad, `std` içindeki `Future` trait'inin `poll` metoduyla aynıdır.
fn poll(&self) {
println!("yoklaniyor");
}
}
impl<T> BenimYoklayici for T {}
fn main() {
// Pin<&mut async {}>, hem `std::future::Future` hem `BenimYoklayici` uygular.
// Eğer iki trait de kapsamdaysa (Rust 2024'te olduğu gibi),
// hangi `poll` metodunun çağrılacağı belirsizleşir
core::pin::pin!(async {}).poll();
}
Bunu tüm sürümlerde çalışacak şekilde tam nitelikli sözdizimiyle düzeltebiliriz:
fn main() {
// Artık hangi trait metoduna başvurduğumuz açık
<_ as BenimYoklayici>::poll(&core::pin::pin!(async {}));
}
rust_2024_prelude_collisions lint’i, belirsiz tüm metod çağrılarını otomatik
olarak tam nitelikli sözdizimine çevirebilir. Bu lint,
cargo fix --edition çalıştırıldığında otomatik uygulanan
rust-2024-compatibility grubunun parçasıdır. Kodunuzu Rust 2024 ile uyumlu
hale getirmek için şunu çalıştırın:
cargo fix --edition
Alternatif olarak, bu nitelemelerin eklenmesi gereken yerleri bulmak için lint’i elle etkinleştirebilirsiniz:
#![allow(unused)]
fn main() {
// Elle taşıma yapmak için bunu crate köküne ekleyin.
#![warn(rust_2024_prelude_collisions)]
}