Shanraq.org Shanraq.org
Result: сәтсіз әрекеттің себебін жеткізу
IT

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

Result: сәтсіз әрекеттің себебін жеткізу

32-сабақ. Мәтіннен минут санын оқып, қате енгізуді бағдарламаны тоқтатпай түсіндіру.

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

Алдын ала: 10, 22 және 29–31-сабақтар. Some пен None шатасса, 31-сабақты қайталаңыз.

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

Қажет қағаз жәшікте болмаса, ол жоқ деп айтамыз. Ал қағазда минут орнына «жақында» деп жазылса, қағаз бар, бірақ санды оқу мүмкін болмады. Result<T, E> — әрекет сәтті не сәтсіз аяқталуы мүмкін жағдайда қолданылатын Rust стандартты санамалауы. Ok(T) сәтті нәтижені, Err(E) қатенің себебін сақтайды. Ұқсатудың шегі: компилятор екі нұсқаны өңдетеді, бірақ оқушыға түсінікті қате мәтінін өзі жазып бермейді.

Мәтін → санға айналдыру әрекеті → Ok(сан) не Err(себеп)match → жауап. Result<u32, String> ішінде сәтті нәтиже u32, қате туралы хабар String болады. <u32, String> арасындағы үтір екі түрді бөледі. .parse::<u32>() әдісі мәтіннен u32 санын оқуға тырысады; ::<u32> әдіске қандай түр керек екенін көрсетеді. Бұл салыстыру белгісі емес. Әдіс Result қайтарады, сондықтан жарамсыз мәтіннің өзі бағдарламаны тоқтатпайды.

Екі мәтінді тексеру

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

read_minutes функциясы мәтінді санға айналдыру қатесін өз түсіндірмемізге ауыстырады. Err(_) сәтсіздікті таниды, ал 30-сабақтағы _ белгісі әзірше қажет емес техникалық деректі атамай өткізеді. Екі тармақ та Result<u32, String> қайтарады. main функциясы сәттілікті де, қатені де ашық өңдейді.

fn read_minutes(text: &str) -> Result<u32, String> {
    match text.parse::<u32>() {
        Ok(minutes) => Ok(minutes),
        Err(_) => Err(String::from("Минут санын енгізіңіз")),
    }
}

fn main() {
    for text in ["25", "жақында"] {
        match read_minutes(text) {
            Ok(minutes) => println!("Минут: {minutes}"),
            Err(message) => println!("Қате: {message}"),
        }
    }
}
Минут: 25
Қате: Минут санын енгізіңіз

0 да u32 саны ретінде дұрыс оқылады: жазылымы жарамды. «Минут нөлден үлкен болсын» талабы — санның мағынасына қатысты бөлек тексеру; оны келесі сабақта қосамыз. Теріс сан u32 түріне сыймайды, сондықтан Err шығады.

Қате — мән, бағдарламаның күйреуі емес

Result<u32, String> дайын u32 саны емес. Келесі бөлек мысал E0308 қатесімен құрастырылмайды:

fn main() {
    let minutes: u32 = "25".parse::<u32>();
    println!("{minutes}");
}

Result түріндегі .unwrap() әдісі Ok ішіндегі мәнді алады, бірақ Err келсе, бағдарламаны panic арқылы тоқтатады. Пайдаланушының қате енгізуі күтілетін жағдай, оны түсіндіру керек. Сондықтан мұнда екі нұсқаны да match арқылы өңдеңіз. 31-сабақтағы Option «мән бар ма?» деп жауап береді, ал Result сәтсіздіктің себебін де алып жүре алады.

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

  1. Result<u32, String> ішіндегі екінші String нені білдіреді?
  2. Неге "0".parse::<u32>() бірден қате емес?
  3. Пайдаланушы енгізуі үшін .unwrap() неге қолайсыз?

Жауап: қате хабарының түрі; нөл дұрыс жазылған сан; Err кезінде бағдарлама түсіндірудің орнына тоқтайды. Тірек сызбаны жатқа айтыңыз.

Тапсырма

Міндетті. Мысалдағыдай read_minutes(text: &str) -> Result<u32, String> жазыңыз, бірақ қате хабары Минутты санмен жазыңыз болсын. "30" мен "көп" мәтіндерін тексеріп, Минут: 30 және Қате: Минутты санмен жазыңыз шығарыңыз. Сан Ok ішінен, хабар Err ішінен алынсын.

Шекара. "0" мәтінін тексеріңіз. Неге түрге айналдыру сәтті, бірақ тапсырма ережесі оны кейін қабылдамауы мүмкін?

Ишара

Алдымен match text.parse::<u32>(), одан соң main ішінде нәтиже үшін екінші match жазыңыз. .unwrap() қолданбаңыз.

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

fn read_minutes(text: &str) -> Result<u32, String> {
    match text.parse::<u32>() {
        Ok(minutes) => Ok(minutes),
        Err(_) => Err(String::from("Минутты санмен жазыңыз")),
    }
}

fn main() {
    for text in ["30", "көп"] {
        match read_minutes(text) {
            Ok(minutes) => println!("Минут: {minutes}"),
            Err(message) => println!("Қате: {message}"),
        }
    }
}
Минут: 30
Қате: Минутты санмен жазыңыз

Бағдарлама қате енгізуді түсіндіріп, жұмысын жалғастырады. Result туралы ресми тарау.

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

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

Пікірлер (0)

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