Rust: алғашқы қадамнан жеке жоспарлау құралына дейін 31-сабақ (барлығы 60)
Option: жазба болмауы мүмкін
31-сабақ. Тізімде жоқ орыннан атау іздегенде бағдарламаны тоқтатпай, жоқтығын өңдеу.
Мәтін ИИ көмегімен аударылды.
Алдын ала: 15, 23–24 және 29–30-сабақтар. match тармақтары ұмытылса, 30-сабақты қайталаңыз.
Таныс бейне және тірек сызба
Құжат сақтайтын жәшіктен жоқ нөмірлі қағазды сұрасаңыз, қызметкер не қағазды береді, не оның жоқ екенін айтады. Option<T> — мән болмауы мүмкін жағдайға арналған Rust стандартты санамалауы. Оның Some(T) нұсқасы T түріндегі мәнді сақтайды, None нұсқасы мәннің жоқтығын білдіреді. Ұқсатудың шегі: None неге жоқ екенін айтпайды; қатенің себебін келесі сабақтағы өзге түрмен жеткіземіз.
Сұрау → Option<T> → Some(мән) не None → match арқылы екі жағдай. 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-сабақтағы тұрақты белгі мәселесін шешпейді.
Түсінгеніңізді тексеріңіз
Option<&String>пен&Stringнесімен өзгеше?Noneбос мәтін табылды деген сөз бе?- Бір бөлікті тізімде
.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)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.