Shanraq.org Shanraq.org
Өсе алатын тізім: Vec
IT

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-сабақтағы қарызға алу ережесі қорғайды.

Түсінгеніңізді тексеріңіз

  1. Vec<String> пен [String; 3] айырмасы қандай?
  2. < пен > арасындағы String нені білдіреді?
  3. Өшірілген тапсырманың индексі неге оның тұрақты 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)

Әзірге пікір жоқ. Бірінші болыңыз.