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

Box<[T]> İçin IntoIterator Eklenmesi

Özet

  • Kutulanmış dilimler tüm sürümlerde IntoIterator uygular.
  • Metod çağrısı sözdizimi kullanıldığında (boxed_slice.into_iter() gibi), IntoIterator::into_iter çağrıları 2024 öncesi sürümlerde gizlenir. Bu yüzden boxed_slice.into_iter(), eskiden olduğu gibi hâlâ (&(*boxed_slice)).into_iter() olarak çözülür.
  • boxed_slice.into_iter(), Rust 2024’te IntoIterator::into_iter çağrısı anlamına gelir.

Ayrıntılar

Rust 1.80’e kadar kutulanmış dilimler için IntoIterator uygulanmamıştı. Önceki sürümlerde kutulanmış bir dilim üzerinde .into_iter() çağırırsanız, metod çağrısı otomatik olarak Box<[T]> değerini &[T]e dereference eder ve &T referansları döndüren bir yineleyici üretirdi. Örneğin şu kullanım önceki sürümlerde çalışıyordu:

#![allow(unused)]
fn main() {
// Önceki sürümlerdeki davranış örneği.
let benim_kutulu_dilimim: Box<[u32]> = vec![1, 2, 3].into_boxed_slice();
// Not: 1.80'den eski sürümlerde .into_iter() gerekliydi
for x in benim_kutulu_dilimim.into_iter() {
    // 2024 öncesi sürümlerde x, &u32 türündedir
}
}

Rust 1.80’de kutulanmış dilimler için IntoIterator uygulamaları eklendi. Böylece dilimin öğeleri üzerinde referansla değil, değeri sahiplenerek dolaşmak mümkün oldu:

#![allow(unused)]
fn main() {
// 1.80 ile yeni, tüm sürümlerde
let benim_kutulu_dilimim: Box<[u32]> = vec![1, 2, 3].into_boxed_slice();
for x in benim_kutulu_dilimim { // dikkat: .into_iter() çağrısı gerekmiyor
    // x, u32 türündedir
}
}

Bu örnek tüm sürümlerde geçerlidir; çünkü daha önce bu kullanım hataydı. for döngüleri, .into_iter() metod çağrısının yaptığı gibi otomatik dereference yapmaz.

Ancak bu normalde kırıcı bir değişiklik olurdu; çünkü kutulanmış dilim üzerinde elle .into_iter() çağıran mevcut kod, referanslar üzerinde dönen yineleyiciden değerler üzerinde dönen yineleyiciye dönüşecekti. Bu sorunu çözmek için kutulanmış dilimlerde .into_iter() metod çağrıları sürüme bağlı davranır. 2024’ten önceki sürümlerde referans yineleyicisi döndürmeye devam eder; 2024 ile birlikte ise değer yineleyicisi döndürür.

#![allow(unused)]
fn main() {
// 2024 sürümündeki değişmiş davranış örneği
let benim_kutulu_dilimim: Box<[u32]> = vec![1, 2, 3].into_boxed_slice();
// Hâlâ elle .into_iter() çağıran eski kod örneği
for x in benim_kutulu_dilimim.into_iter() {
    // 2024 sürümünde x artık u32 türündedir
}
}

Taşıma

boxed_slice_into_iter lint’i, kutulanmış dilimler üzerindeki .into_iter() çağrılarını, referans üretmeye devam eden eski davranışı korumak için otomatik olarak .iter() çağrılarına dönüştürür. 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

Örneğin bu komut şunu:

fn main() {
    let benim_kutulu_dilimim: Box<[u32]> = vec![1, 2, 3].into_boxed_slice();
    for x in benim_kutulu_dilimim.into_iter() {
        // x, &u32 türündedir
    }
}

şuna dönüştürür:

fn main() {
    let benim_kutulu_dilimim: Box<[u32]> = vec![1, 2, 3].into_boxed_slice();
    for x in benim_kutulu_dilimim.iter() {
        // x, &u32 türündedir
    }
}

boxed_slice_into_iter lint’i tüm sürümlerde varsayılan olarak uyarı verir; bu yüzden lint’i özellikle susturmadıysanız taşıma öncesinde de bunu görmüş olmanız gerekir.