Rust: алғашқы қадамнан жеке жоспарлау құралына дейін 24-сабақ (барлығы 35)
Өсе алатын тізім: Vec
24-сабақ. Орын санын алдын ала бекітпей, тапсырма атауларын қосу және өшіру.
Мәтін ИИ көмегімен аударылды.
Алдын ала: 15 және 19–23-сабақтар. Тілім мен оның иесін шатастырсаңыз, 23-сабақты қайталаңыз.
Таныс бейне және тірек сызба
15-сабақтағы үш ұялы науаға төртінші ұяны қоса алмайсыз. Ал қағаздағы тізімді жаңа жолдармен жалғастыруға болады. Vec — бір түрдегі мәндерге иелік ететін, өсе алатын тізім; ол ұзындығын сақтап, қажет кезде көбірек орын алады. Бейненің шегі бар: өскенде сақтау орны ауысуы мүмкін, ал ортасынан өшіргенде кейінгі элементтер жылжиды. Индекстер тапсырманың тұрақты нөмірі емес.
Бос тізім → push → ұзындық → & арқылы оқу → remove → жаңа орындар. Сызбаны есте сақтап, тапсырма алдында қайталаңыз. Vec<String> ішіндегі бұрышты жақшалар <...> әр элементтің түрін көрсетеді, мұнда ол String; бұлар салыстыру таңбалары емес. Бұл — параметрленген түр: Vec басқа түрдегі мәндерді де ұстай алады, бірақ бір тізімдегі барлық элементтің түрі бірдей. Vec::new() бос тізім жасайды. push элементті соңына қосады, .len() элемент санын көрсетеді.
Бос тізімнен екі тапсырмаға
organizer жобасында бұрынғы src/main.rs файлын бөлек сақтап, оны келесі мысалмен толық ауыстырыңыз. Cargo.toml бар бумада cargo run орындаңыз. Басқа файлдар мен тәуелділіктер өзгермейді. Cargo хабарларынсыз шығатын нәтижені болжаңыз.
for title in &titles тізімге оқуға арналған қатынау жасап, әр String мәніне сілтемені кезекпен береді. Мұндағы & тізім иелігін қайталау құрылымына өткізбейді; аралап болған соң тізімді қайта қолдануға болады. String::from иелік ететін атаулар жасайды, ал push оларды тізімге береді.
fn main() {
let mut titles: Vec<String> = Vec::new();
titles.push(String::from("Оқу"));
titles.push(String::from("Демалыс"));
println!("Тапсырма саны: {}", titles.len());
for title in &titles {
println!("Тапсырма: {title}");
}
}
Тапсырма саны: 2
Тапсырма: Оқу
Тапсырма: Демалыс
Тізім құрамын өзгерту үшін mut керек. Жиым сияқты, Vec<String> бір түрдегі реттелген элементтерді ұстайды және атауды қайталауға болады. Жиымнан айырмасы — жұмыс кезінде ұзындығы өзгереді. Әзірге Vec тек жадтағы тізім: бағдарламаны жапқанда тапсырмалар сақталмайды. Файлдарды кейін қараймыз.
Өшіру және иелік
remove(1) индексі 1 элементті өшіріп, оның String мәнін шақырушы кодқа қайтарады. Кейінгі элементтер солға жылжиды. Индекс .len() мәнінен кіші болуы керек; әйтпесе бағдарлама дүрбелеңмен (panic) тоқтайды. Сондықтан пайдаланушы берген индексті өшірер алдында шекарасын тексеру қажет; мұнда индексті өзіміз жаздық. Қалған элементтер тізімнің иелігінде қалады.
Атау бұрын айнымалыда болса, push(title) оның иелігін тізімге өткізеді. Келесі бөлек бағдарлама E0382 қатесімен әдейі құрастырылмайды:
fn main() {
let title = String::from("Оқу");
let mut titles: Vec<String> = Vec::new();
titles.push(title);
println!("{title}");
}
Енді сол String мәніне тізім иелік етеді, ал бұрынғы title атауы оны қолдана алмайды. Тізімдегі атауды тек оқу керек болса, &titles арқылы аралаңыз; барлық мәтінді орынсыз көшірмеңіз. Элемент сілтемесі әлі қолданылып жатқанда сақтау орнын ауыстыруы мүмкін тізім құрамын өзгертуге болмайды; мұны 21-сабақтағы қарызға алу ережесі қорғайды.
Түсінгеніңізді тексеріңіз
Vec<String>пен[String; 3]айырмасы қандай?<пен>арасындағыStringнені білдіреді?- Өшірілген тапсырманың индексі неге оның тұрақты ID нөмірі бола алмайды?
Тексеру: өсе алатын және бекітілген ұзындық; әр элементтің түрі; өшіру орындарды жылжытады. Тізім ұзындығын соңғы жазбаның нөмірімен шатастырмаңыз.
Тапсырма
Міндетті. Бос Vec<String> жасап, оған Оқу, Серуен, Демалыс қосыңыз. Индексі 1 элементті remove арқылы өшіріп, Өшірілді: Серуен, содан кейін қалған атауларды ретімен және Қалды: 2 шығарыңыз. Аралау үшін &titles қолданыңыз. Тізімді аралаудың орнына атауларды дайын жолмен баспаңыз.
Шекара. Ұзындығы 3 тізімде remove(3) не істейді? Неге жарамдылықты <= titles.len() арқылы тексеруге болмайды?
Көмек
remove(1) нәтижесін removed айнымалысына сақтаңыз. Өшірген соң for title in &titles арқылы аралаңыз. Элемент санын .len() әдісінен алыңыз.
Өз бетіңізше орындағаннан кейінгі үлгі жауап
fn main() {
let mut titles: Vec<String> = Vec::new();
titles.push(String::from("Оқу"));
titles.push(String::from("Серуен"));
titles.push(String::from("Демалыс"));
let removed = titles.remove(1);
println!("Өшірілді: {removed}");
for title in &titles {
println!("Тапсырма: {title}");
}
println!("Қалды: {}", titles.len());
}
Өшірілді: Серуен
Тапсырма: Оқу
Тапсырма: Демалыс
Қалды: 2
Өшірілген мәнге removed, ал қалғандарына тізім иелік етеді. Vec туралы ресми түсіндірме.
Пікірлер (0)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.