Rust: алғашқы қадамнан жеке жоспарлау құралына дейін 45-сабақ (барлығы 50)
Жалпыланған түр: әртүрлі тізімге бір қызмет
45-сабақ. Элемент түрі әртүрлі тізімдерге жарайтын қызметті оқу және жазу.
Мәтін ИИ көмегімен аударылды.
Алдын ала: тілімдер, Option, модульдер. Бұрынғы жобаны сақтап, src/main.rs файлын төмендегі мысалмен ауыстырыңыз. Мұндағы тапсырмалар да әзірше жадта ғана тұрады.
Таныс бейне және тірек сызба
Киім сақтайтын жердегі нөмір белгілі бір орынды көрсетеді: онда пальто да, сөмке де тұруы мүмкін, ал «нөмір бойынша тауып бер» ережесі өзгермейді. Жалпыланған түр осындай ережені бір рет жазуға мүмкіндік береді. fn choose<T>(items: &[T], index: usize) -> Option<&T> ішіндегі T — әзірше нақты аталмаған бір элементтің түрі. Қызмет атауынан кейінгі бұрышты жақшалар түр параметрін жариялайды; бұл сандарды салыстыру емес. Сандармен шақырғанда компилятор сан түрін, тапсырмалармен шақырғанда Task түрін қолданады. Ұқсатудың шегі: қызмет T мәніне кез келген әрекет жасай алмайды; мұнда ол тек тілімнен элемент таңдайды.
&[T] тілімі + usize орны → get → Some(&T) не None. &[T] — бір түрдегі элементтердің қарызға алынған тілімі, usize — орын нөміріне арналған таңбасыз бүтін сан түрі; оның ені компьютер платформасына байланысты. get шекараны тексереді: жоқ орын үшін бағдарлама тоқтамай, None қайтарады. Option<&T> сілтеме қайтарады, сондықтан қызмет элементті жиымнан алып кетпейді. & белгісі сілтемені білдіреді; Option болмауы мүмкін жағдайды қосады. Сілтеменің өмір сүру уақытын бұл жерде жеке таңбамен жазбаймыз: қарызға алынған жалғыз кіріс items шығыстың қай дерекке байланысын анықтайды. Толық ереже өмір сүру уақыты туралы сабақта қаралады. Vec<T> түрінен <> таныс; енді дайын түрді оқып қана қоймай, өз T параметрімізді жариялаймыз.
Бір ережені екі түрлі дерекке қолданыңыз
src/main.rs файлын ауыстырып, cargo run пәрменін орындаңыз. Қосымша тәуелділік жоқ. Төменде Cargo-ның қызметтік хабарлары емес, бағдарламаның нәтижесі берілген.
fn choose<T>(items: &[T], index: usize) -> Option<&T> {
items.get(index)
}
struct Task {
title: String,
}
fn main() {
let numbers = [10, 20];
let tasks = [Task {
title: String::from("Rust оқу"),
}];
if let Some(number) = choose(&numbers, 1) {
println!("Сан: {number}");
}
if let Some(task) = choose(&tasks, 0) {
println!("Тапсырма: {}", task.title);
}
println!("Элемент жоқ: {}", choose(&numbers, 9).is_none());
}
Сан: 20
Тапсырма: Rust оқу
Элемент жоқ: true
choose(&numbers, 9) нәтижесі None, ал is_none() — true. Оның орнына items[index] жазылса, жоқ орында бағдарлама үрейлі тоқтайды. Бұл тәсілдің өзі тапсырманы тұрақты ID бойынша іздемейді: тілімдегі орын өшірген соң ауысады, мұны 38-сабақта көрдік.
Бетке қарамай жауап беріңіз
chooseкейінгі<T>нені жариялайды?- Нәтиже неге жай
&Tемес,Option<&T>? 0орны тапсырманың тұрақты ID-сіне тең бе?
Тапсырма
Міндетті. Соңғы элементті немесе бос тілім үшін None қайтаратын өз fn last<T>(items: &[T]) -> Option<&T> қызметіңізді жазыңыз. Оны tasks үшін қолданып, Соңғы: Rust оқу шығарыңыз; кейін бос сан жиымын тексеріңіз. len() - 1 орнын қолданбаңыз: бос жиымда қате шығады.
Жауаптар
Жауаптарды көрсету
Тілімнің last() әдісі дайын Option<&T> қайтарады. Оны өз қызметіңіздің ішінде шақырып, main ішінде Some нұсқасын өңдеңіз.
Талпыныстан кейінгі үлгі жауап
fn choose<T>(items: &[T], index: usize) -> Option<&T> {
items.get(index)
}
fn last<T>(items: &[T]) -> Option<&T> {
items.last()
}
struct Task {
title: String,
}
fn main() {
let numbers = [10, 20];
let tasks = [Task {
title: String::from("Rust оқу"),
}];
if let Some(number) = choose(&numbers, 1) {
println!("Сан: {number}");
}
if let Some(task) = choose(&tasks, 0) {
println!("Тапсырма: {}", task.title);
}
println!("Элемент жоқ: {}", choose(&numbers, 9).is_none());
if let Some(task) = last(&tasks) {
println!("Соңғы: {}", task.title);
}
let empty: [u32; 0] = [];
println!("Бос тізім: {}", last(&empty).is_none());
}
Сан: 20
Тапсырма: Rust оқу
Элемент жоқ: true
Соңғы: Rust оқу
Бос тізім: true
Тексергеннен кейін
Бос жиым үшін last(&[]) нәтижесі None; бос жиымның түрін көрсету керек, мысалы let empty: [u32; 0] = [];. Жалпыланған түрлер туралы ресми тарау. Some пен None шатастырса, 31-сабақты қайталаңыз.
Пікірлер (0)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.