Box<[T]> İçin IntoIterator Eklenmesi
Özet
- Kutulanmış dilimler tüm sürümlerde
IntoIteratoruygular. - 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üzdenboxed_slice.into_iter(), eskiden olduğu gibi hâlâ(&(*boxed_slice)).into_iter()olarak çözülür. boxed_slice.into_iter(), Rust 2024’teIntoIterator::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.