Shanraq.org Shanraq.org
Option: жазба болмауы мүмкін
IT

Rust: алғашқы қадамнан жеке жоспарлау құралына дейін 31-сабақ (барлығы 60)

Option: жазба болмауы мүмкін

31-сабақ. Тізімде жоқ орыннан атау іздегенде бағдарламаны тоқтатпай, жоқтығын өңдеу.

Мәтін ИИ көмегімен аударылды.

Алдын ала: 15, 23–24 және 29–30-сабақтар. match тармақтары ұмытылса, 30-сабақты қайталаңыз.

Таныс бейне және тірек сызба

Құжат сақтайтын жәшіктен жоқ нөмірлі қағазды сұрасаңыз, қызметкер не қағазды береді, не оның жоқ екенін айтады. Option<T> — мән болмауы мүмкін жағдайға арналған Rust стандартты санамалауы. Оның Some(T) нұсқасы T түріндегі мәнді сақтайды, None нұсқасы мәннің жоқтығын білдіреді. Ұқсатудың шегі: None неге жоқ екенін айтпайды; қатенің себебін келесі сабақтағы өзге түрмен жеткіземіз.

Сұрау → Option<T>Some(мән) не Nonematch арқылы екі жағдай. Vec<String> жазылымындағы бұрышты жақша сияқты, мұнда да ішіндегі ықтимал мәннің түрі көрсетіледі. Option<&String> болса, ішіндегі мән — String мәтініне сілтеме, жаңа көшірме емес. Some мен None үшін бөлек енгізу пәрмені қажет емес. Option<T> мәнін T бар деп бірден пайдалана алмаймыз: алдымен нұсқасын анықтаймыз.

Тізімнен қауіпсіз оқу

organizer жобасының бұрынғы src/main.rs файлын сақтап, оны толық ауыстырыңыз. Cargo.toml орналасқан бумада cargo run орындаңыз. Басқа файлдар мен тәуелділіктер өзгермейді. Екі жолдық нәтижені болжаңыз.

Vec түрінің .get(index) әдісі көрсетілген орындағы бөлікті сұрайды. titles[index] жазылымынан айырмасы: орын жоқ болса, бағдарлама тоқтамайды, Option<&String> қайтарады. Some(title) табылған мәтінге сілтемені title деп атайды, None жоқ орынды өңдейді. Тізімді 24-сабақтағы Vec::new() мен push арқылы жасаймыз. Нөлінші орын бар, ал бір бөлікті тізімде 2-орын жоқ.

fn main() {
    let mut titles: Vec<String> = Vec::new();
    titles.push(String::from("Оқу"));
    for index in [0, 2] {
        match titles.get(index) {
            Some(title) => println!("Табылды: {title}"),
            None => println!("{index}-орында жазба жоқ"),
        }
    }
}
Табылды: Оқу
2-орында жазба жоқ

get атауды көшірмейді және оған иелікті бермейді: табылған мән titles тізімінен оқуға қарызға алынған. Тізімді кейін қолдануға болады.

Жоқ мән мен бос мәтін бөлек

Some(String::from("")) мән бар, тек мәтіні бос дегенді білдіреді. None болса, мән мүлде жоқ. Бұлар бірдей емес. Кейде жалғыз None жазылғанда құрастырушы ішінде қандай түр болуы мүмкін екенін білмейді; let missing: Option<String> = None; оны анық көрсетеді. titles.get(index) үшін түр тізімнен белгілі.

.get() нәтижесін нұсқасын ажыратпай жай сілтемеге берсек, келесі бөлек мысал E0308 қатесімен құрастырылмайды:

fn main() {
    let mut titles: Vec<String> = Vec::new();
    titles.push(String::from("Оқу"));
    let title: &String = titles.get(0);
    println!("{title}");
}

Дұрыс жол — Some пен None тармақтары бар match не жоқтығын өңдеудің кейін түсіндірілетін басқа тәсілі. Тізімдегі орын әзірше тапсырманың тұрақты нөмірі емес: get шекарадан шықпайды, бірақ 38-сабақтағы тұрақты белгі мәселесін шешпейді.

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

  1. Option<&String> пен &String несімен өзгеше?
  2. None бос мәтін табылды деген сөз бе?
  3. Бір бөлікті тізімде .get(2) неге бағдарламаны тоқтатпайды?

Жауап: сілтеме жоқ та болуы мүмкін; жоқ, бос мәтін де мән саналады; get None қайтарады. Бетті жауып, тірек сызбаны айтыңыз.

Тапсырма

Міндетті. Оқу және Серуен атаулары бар тізім жасаңыз. .get() арқылы 1 және 2-орынды сұрап, екеуін де match көмегімен өңдеңіз. Табылды: Серуен және 2-орын жоқ шығарыңыз. Ұзындықты өзіңіз тексермеңіз, хабарға дайын атауды қоймаңыз.

Шекара. Бос тізім жасап, .get(0) не қайтаратынын түсіндіріңіз.

Ишара

[1, 2] ішіндегі әр index үшін match titles.get(index) жазыңыз. Some(title) тармағында табылған атауды, None тармағында орын нөмірін көрсетіңіз.

Талпыныстан кейінгі үлгі жауап

fn main() {
    let mut titles: Vec<String> = Vec::new();
    titles.push(String::from("Оқу"));
    titles.push(String::from("Серуен"));
    for index in [1, 2] {
        match titles.get(index) {
            Some(title) => println!("Табылды: {title}"),
            None => println!("{index}-орын жоқ"),
        }
    }
}
Табылды: Серуен
2-орын жоқ

Тізім атаулардың иесі болып қалады, ал жоқ орын анық өңделеді. Option туралы ресми тарау.

Алдыңғы сабақ · Мазмұны · Келесі сабақ

Мәтінде қате не теру қатесі кездессе, бізге айтыңыз

Пікірлер (0)

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