Shanraq.org Shanraq.org
Санамалау: тапсырманың рұқсат етілген күйлері
IT

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

Санамалау: тапсырманың рұқсат етілген күйлері

29-сабақ. Тапсырма күйін өзара үйлеспейтін бірнеше нұсқаның біреуімен көрсету.

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

Алдын ала: 11, 12, 14 және 27–28-сабақтар. Құрылым өрістері ұмытылса, 27-сабақты қайталаңыз.

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

Есіктегі тақтайшада бір мезгілде бір ғана жазу тұрады: «басталмаған», «орындалып жатыр», «аяқталған». Үш бөлек bool сақтасақ, байқамай «орындалып жатыр» мен «аяқталған» белгілерін қатар қоя аламыз. Санамалау (enum) — нақты аталған нұсқалардан тұратын түр; оның бір мәні бір уақытта тек бір нұсқаны таңдайды. Ұқсатудың шегі: кей нұсқа өзіне қосымша дерек те сақтайды, ал қарапайым тақтайша мұны көрсетпейді.

Status түрі → нұсқалар → Status::Doing(15) мәні → нұсқаны ажырату. enum Status { ... } мүмкін күйлерді жариялайды. Status::Planned пен Status::Done қосымша дерек сақтамайды. Doing(u32) — «орындалуда» нұсқасы бір минут санын сақтайды деген сөз. Осы жерде дөңгелек жақша деректің түрін, ал Status::Doing(15) ішінде нақты санды көрсетеді. :: түрден нұсқаға баратын жол. Бұл бөлек функция емес.

Бір сәтте бір күй

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

Нұсқаның ішіндегі санды көрсету үшін тармақ таңдаймыз. match status { ... } мәнді нұсқалардың үлгілерімен салыстырады. Status::Doing(minutes) => ... дегеніміз: Doing таңдалса, ішіндегі санға minutes атауын беріп, => таңбасынан кейінгі әрекетті орындау. => үлгі мен әрекетті бөледі, ал үтір тармақтарды бөледі. Planned және Done да қамтылғандықтан, барлық мүмкін күй өңделеді. match жазылымын келесі сабақта кеңірек жаттығамыз.

enum Status {
    Planned,
    Doing(u32),
    Done,
}

fn main() {
    let status = Status::Doing(15);
    match status {
        Status::Planned => println!("Басталмаған"),
        Status::Doing(minutes) => println!("Орындалуда: {minutes} мин"),
        Status::Done => println!("Аяқталған"),
    }
}
Орындалуда: 15 мин

Мұндағы 15 — бүкіл тапсырмаға берілген уақыт емес, жұмсалған минут саны. Done мәнінде Doing дерегі қатар бола алмайды: бір мәнде бір ғана нұсқа бар. Дегенмен Rust Doing(0) мәніне тыйым салмайды; санның мағынасын өзіміз тексереміз.

Task ішіндегі санамалау

Құрылым өрісінің түрі өзіміз жасаған санамалау бола алады. Келесі бөлек мысалда тапсырма жасалып, тек күйі өзгереді. Атауы сол қалпында қалады.

enum Status {
    Planned,
    Doing(u32),
    Done,
}

struct Task {
    title: String,
    status: Status,
}

fn main() {
    let mut task = Task {
        title: String::from("Оқу"),
        status: Status::Planned,
    };
    task.status = Status::Done;
    println!("{} аяқталды", task.title);
}
Оқу аяқталды

Бұл хабар белгілі жолмен орындалғандықтан дұрыс. Күй алдын ала белгісіз болса, дайын хабарды шығара салмай, task.status мәнін match арқылы оқу керек. 30-сабақта осылай жасаймыз.

Нұсқа ішіндегі деректің де түрі бар. Келесі бөлек мысал E0308 қатесімен әдейі құрастырылмайды: Doing үшін мәтін емес, u32 саны қажет.

enum Status { Doing(u32) }
fn main() {
    let status = Status::Doing("15");
}

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

  1. Өзара үйлеспейтін күйлерге үш бөлек bool емес, Status неге ыңғайлы?
  2. Status::Doing(15) нұсқа атауынан басқа не сақтайды?
  3. enum санның нөлден үлкен екенін өзі тексере ме?

Жауап: бір мән бір нұсқаны ғана таңдайды; нұсқада 15 мәнді u32 бар; жоқ, бұл — жоспарлау құралының жеке ережесі. Бетті жауып, тірек сызбаны жатқа айтыңыз.

Тапсырма

Міндетті. Planned, Doing(u32) және Done нұсқалары бар Status жариялаңыз. Status::Doing(25) жасап, match арқылы Орындалуда: 25 мин шығарыңыз. Қалған екі нұсқаға Басталмаған және Аяқталған хабарларын жазыңыз, сонда код кез келген күйге жарайды. Нәтижедегі сан нұсқаның ішінен алынсын.

Өзгеріс. Мәнді Status::Done етіп ауыстырып, Аяқталған шығатынын тексеріңіз.

Ишара

match status ішінде үш тармақ керек. Status::Doing(minutes) тармағындағы minutes атауын => таңбасының оң жағындағы println! қолдана алады.

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

enum Status {
    Planned,
    Doing(u32),
    Done,
}

fn main() {
    let status = Status::Doing(25);
    match status {
        Status::Planned => println!("Басталмаған"),
        Status::Doing(minutes) => println!("Орындалуда: {minutes} мин"),
        Status::Done => println!("Аяқталған"),
    }
}
Орындалуда: 25 мин

Күй біреу ғана, ал «орындалуда» дерегі дәл сол нұсқаға байланған. Санамалау туралы ресми тарау.

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

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

Пікірлер (0)

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