Rust: алғашқы қадамнан жеке жоспарлау құралына дейін 42-сабақ (барлығы 50)
Тұйықталым: керекті тапсырмаларды таңдау
42-сабақ. Сөз бойынша тапсырмаларды тауып, тұрақты ретпен көрсету.
Мәтін ИИ көмегімен аударылды.
Алдын ала: итераторлар, мәтін жолдары, тұрақты ID. Алдыңғы main.rs файлының көшірмесін сақтаңыз: мысал файлды түгел ауыстырады, дерек әлі жадта ғана тұрады.
Таныс бейне және тірек сызба
Кітапханадағы көмекшіге «атауында Rust сөзі бар қағаздарды ірікте» деген қысқа ереже берілді делік. Тұйықталым (closure) — айналасындағы мәнді есінде ұстай алатын атаусыз қызмет. |task| task.title.contains(query) жазылымындағы тік сызықтар кіріс task мәнін қоршайды; query сырттағы айнымалыдан алынады. Ұқсатудың шегі: ереже берілген сәтте іріктеу бірден жүрмейді. Итератор нәтижені сұрағанда ғана жұмыс бастайды.
Барлық тапсырма → filter (сәйкесін қалдыру) → collect (жинау) → sort_by_key (реттеу) → көрсету. filter шартты тексеретін тұйықталымды қолданады. iter() элементті &Task сілтемесімен береді, ал filter тексеру үшін сол сілтеменің өзін қарызға алады. Сондықтан оның кірісі &&Task — сілтемеге сілтеме. Rust .title өрісін оқығанда екі қабатты өзі өтеді; sort_by_key ішіндегі .id пен map ішіндегі .title да осылай оқылады. contains таңбаларды дәл іздейді: үлкен және кіші әріп бөлек, сондықтан rust пен Rust бірдей емес. collect бұл жерде Vec<&Task> — тапсырмаларға сілтемелер тізімін жасайды; бастапқы тапсырмалар орнында қалады. let found: Vec<&Task> ішіндегі қос нүкте нәтиженің түрін көрсетеді. sort_by_key(|task| task.id) атаумен емес, ID бойынша реттейді. map әр тапсырмадан атауының &str сілтемесін алады; as_str() мәтінді көшірмейді. names.len() нәтиже санын береді. Мұнда names тізімі map жұмысын көрсету үшін жасалған; тек сан керек болса, жаңа тізім құрмай found.len() қолдануға болады. Мұндағы тік сызықтар Rust жазылымының бөлігі, 40-сабақтағы пәрмендерді көрсететін ажыратқыш емес.
Іздеп көріңіз
src/main.rs файлын ауыстырып, cargo run пәрменін орындаңыз. Бағдарлама нәтижесі Cargo хабарларынан бөлек көрсетілген. Қосымша кітапхана жоқ.
struct Task {
id: u32,
title: String,
}
fn main() {
let tasks = vec![
Task {
id: 3,
title: String::from("Rust оқу"),
},
Task {
id: 2,
title: String::from("Нан алу"),
},
Task {
id: 1,
title: String::from("Rust қайталау"),
},
];
let query = "Rust";
let mut found: Vec<&Task> = tasks
.iter()
.filter(|task| task.title.contains(query))
.collect();
found.sort_by_key(|task| task.id);
let names: Vec<&str> = found.iter().map(|task| task.title.as_str()).collect();
println!("Табылды: {}", names.len());
for task in found {
println!("{}: {}", task.id, task.title);
}
}
Табылды: 2
1: Rust қайталау
3: Rust оқу
Бастапқы тізімде ID 3 алдымен тұрса да, нәтижеде ID 1 алда шығады. Бастапқы tasks өзгермейді. Ештеңе табылмаса, found бос болады және цикл еш жол шығармайды: бұл қате емес. Әр іздеу тізімді қайта аралайды; жылдамдатуды кейін қарастырамыз.
Бетке қарамай жауап беріңіз
- Тұйықталым
queryмәнін қайдан алады? collectбастапқы тапсырмаларды неге жоймайды?sort_by_keyтапсырмалардың тұрақты ID-сін өзгерте ме?
Тапсырма
Міндетті. Негізгі нәтижеден соң атауында Нан сөзі бар тапсырмалар санын filter және count арқылы тауып, «Нан» сөзі бойынша: 1 шығарыңыз. Бастапқы тізімді өзгертпеңіз. Кейін нан деп іздеп, айырмасын түсіндіріңіз.
Жауаптар
Жауаптарды көрсету
second_query жасаңыз. tasks.iter().filter(|task| task.title.contains(second_query)).count() іріктеуді орындап, санын қайтарады.
Талпыныстан кейінгі үлгі жауап
struct Task {
id: u32,
title: String,
}
fn main() {
let tasks = vec![
Task {
id: 3,
title: String::from("Rust оқу"),
},
Task {
id: 2,
title: String::from("Нан алу"),
},
Task {
id: 1,
title: String::from("Rust қайталау"),
},
];
let query = "Rust";
let mut found: Vec<&Task> = tasks
.iter()
.filter(|task| task.title.contains(query))
.collect();
found.sort_by_key(|task| task.id);
let names: Vec<&str> = found.iter().map(|task| task.title.as_str()).collect();
println!("Табылды: {}", names.len());
for task in found {
println!("{}: {}", task.id, task.title);
}
let second_query = "Нан";
let second_count = tasks
.iter()
.filter(|task| task.title.contains(second_query))
.count();
println!("«{second_query}» сөзі бойынша: {second_count}");
}
Табылды: 2
1: Rust қайталау
3: Rust оқу
«Нан» сөзі бойынша: 1
Тексергеннен кейін
sort_by_key табылған сілтемелерді реттейді, тапсырмалардың ID-сі өзгермейді. Тұйықталымдар туралы ресми тарау · итераторлар туралы тарау. Кейінге қалдырылған аралау түсініксіз болса, 41-сабақты қайталаңыз.
Пікірлер (0)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.