Rust: алғашқы қадамнан жеке жоспарлау құралына дейін 30-сабақ (барлығы 35)
match: әр нұсқаны өңдеу
30-сабақ. Тапсырма күйін толық ажыратып, ұмытылған нұсқаны бағдарламаны іске қоспай тұрып табу.
Мәтін ИИ көмегімен аударылды.
Алдын ала: 12, 14, 19 және 29-сабақтар. Status::Doing(15) түсініксіз болса, 29-сабақты қайталаңыз.
Таныс бейне және тірек сызба
Кезекшіге үш түрлі таңбаның біреуі басылған парақ беріледі. Қай парақ келсе де не істеу керегін білу үшін әр таңбаға нұсқау жазылады. Үлгімен сәйкестендіру (pattern matching) — мәннің пішінін тексеру, ал ішінде дерек болса, оған атау беру. match сәйкес келген бір ғана тармақты таңдайды. Ұқсатудың шегі: қағаздағы нұсқау ұмытылуы мүмкін, ал Rust барлық мүмкін нұсқаның қамтылғанын құрастыру кезінде тексереді.
Мән → match → үлгілер → бір тармақ → нәтиже. Тармақтар жоғарыдан төмен қаралады. Status::Doing(minutes) — Doing нұсқасының үлгісі, ішіндегі санға minutes деген жаңа атау береді. => үлгі мен әрекетті немесе нәтижені бөледі. Бірнеше тәуелсіз шарттан тұратын if жазылымынан айырмасы — match барлық мүмкін нұсқаны қамтуы керек; әйтпесе код құрастырылмайды. _ белгісі «қалған кез келген жағдай» үлгісі бола алады, бірақ кейін қосылған жаңа күй де соған түседі.
Толық талдаудың нәтижесі
organizer жобасындағы бұрынғы src/main.rs файлын сақтап, оны толық ауыстырыңыз. Cargo.toml орналасқан бумада cargo run орындаңыз. Басқа файлдар мен тәуелділіктер жоқ. Нәтижені алдын ала болжаңыз.
match — өрнек: оның нәтижесін айнымалыға беруге болады. Мұнда ол «қазір жұмыста есептелетін минут қанша?» деген нақты сұраққа жауап береді. Planned және Done үшін 0: дәл қазір жұмыс жүріп жатқан жоқ. Doing(minutes) үшін нұсқаның ішіндегі сан алынады. Үш тармақ та u32 қайтарады, сондықтан бүкіл өрнектің түрі біреу. Жабушы } таңбасынан кейінгі ; let жолын аяқтайды.
enum Status {
Planned,
Doing(u32),
Done,
}
fn main() {
let status = Status::Doing(10);
let active_minutes: u32 = match status {
Status::Planned => 0,
Status::Doing(minutes) => minutes,
Status::Done => 0,
};
println!("Қазір жұмыста: {active_minutes} мин");
}
Қазір жұмыста: 10 мин
Барлық тармақ қатар орындалмайды: мәнге сай біреуі таңдалады. Doing(10) орнына Done жазылса, нәтиже 0 болады. Бұл аяқталған тапсырмаға бұрын уақыт жұмсалмады деген сөз емес; біз тек қазіргі жұмысты санап отырмыз.
Ұмытылған тармақ пен _
Done тармағын алып тастасақ, құрастырушы келесі бөлек мысалды E0004 қатесімен тоқтатады. Ол бұл күйді нәтижесіз қалдырмайды:
enum Status { Planned, Doing(u32), Done }
fn main() {
let status = Status::Done;
let minutes = match status {
Status::Planned => 0,
Status::Doing(value) => value,
};
println!("{minutes}");
}
_ — әлі өңделмеген кез келген мәнге сәйкес үлгі. Мысалы, Status::Done => ... және _ => ... тармақтары барлық күйді қамтиды. Бірақ кейін жаңа нұсқа қосылса, _ оның бөлек өңделмегенін жасырады. Жоспарлау құралындағы әр күйдің өз мағынасы болса, нұсқаларды жеке атаңыз. Қалған жағдайлардың бәріне әдейі бір әрекет таңдалғанда _ пайдалы.
Бір нұсқа ғана керек болса
if let 12-сабақтағы шартты тармақты бір үлгімен біріктіреді. if let Status::Doing(minutes) = status жаңа мәнді status ішіне жазбайды, екі санды да салыстырмайды: мән үлгіге сай ма деп қарайды, сай болса ішіндегі санды minutes деп атайды. else өзге нұсқаларды өңдейді. Бұл бөлек бағдарлама; оның нәтижесі алдыңғы мысалға тәуелді емес.
enum Status { Planned, Doing(u32), Done }
fn main() {
let status = Status::Doing(5);
if let Status::Doing(minutes) = status {
println!("Жұмыс жүріп жатыр: {minutes} мин");
} else {
println!("Қазір жұмыс жүріп жатқан жоқ");
}
}
Жұмыс жүріп жатыр: 5 мин
Әр нұсқаға бөлек әрекет қажет болса, толық match қолданыңыз. Бір нұсқа ғана маңызды болса, if let қысқа болады; өзге нұсқалар да әрекет талап етсе, else керек.
26–30 сабақтардың бақылау нүктесі
Бетке қарамай түсіндіріңіз: кортеж бөліктерді ретімен жинайды; құрылым оларға атау береді; әдіс әрекетті түрмен байланыстырады; санамалау мүмкін нұсқаларды шектейді; match олардың түгел өңделуін тексереді. Бір қадам көмескіленсе, тиісті 26–29-сабаққа оралып, тірек сызбасын қалпына келтіріңіз.
Тапсырма
Міндетті. Planned, Doing(u32) және Done нұсқалары бар Status жасаңыз. Толық match қолданатын active_minutes(status: Status) -> u32 функциясын жазыңыз: Planned пен Done үшін 0, Doing үшін ішіндегі сан. main ішінде оны Doing(25) және Done мәндерімен шақырып, Жұмыс: 25 мин және Аяқталғаннан кейін: 0 мин шығарыңыз. println! ішіне дайын санды қойып, match бөлігін айналып өтпеңіз.
Шекара. Done тармағын алып тастап, E0004 қатесін оқыңыз, кейін тармақты қайтарыңыз.
Ишара
match status функцияның ; таңбасыз соңғы өрнегі болсын. Status::Doing(minutes) тармағына minutes мәнін қайтару жеткілікті.
Талпыныстан кейінгі үлгі жауап
enum Status {
Planned,
Doing(u32),
Done,
}
fn active_minutes(status: Status) -> u32 {
match status {
Status::Planned => 0,
Status::Doing(minutes) => minutes,
Status::Done => 0,
}
}
fn main() {
let during = active_minutes(Status::Doing(25));
let after = active_minutes(Status::Done);
println!("Жұмыс: {during} мин");
println!("Аяқталғаннан кейін: {after} мин");
}
Жұмыс: 25 мин
Аяқталғаннан кейін: 0 мин
Функция енді әр күйге белгілі нәтиже береді. match туралы ресми тарау және if let туралы түсіндірме.
Пікірлер (0)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.