Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Prelude’deki Değişiklikler

Özet

  • Future ve IntoFuture trait’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)]
}