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");
}
Түсінгеніңізді тексеріңіз
- Өзара үйлеспейтін күйлерге үш бөлек
boolемес,Statusнеге ыңғайлы? Status::Doing(15)нұсқа атауынан басқа не сақтайды?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)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.