Shanraq.org Shanraq.org
Кортеж: бір функциядан екі нәтиже
IT

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

Кортеж: бір функциядан екі нәтиже

26-сабақ. Тапсырма атауы мен уақытын бірге қайтарып, әр мәнді өз орнымен алу.

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

Алдын ала: 9, 14, 19 және 22-сабақтар. Функция мәнді қалай қайтаратыны ұмытылса, 14-сабақты қайталаңыз.

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

Тапсырма жазылған қағазда атау мен минут саны екі бөлек орынға жазылады. Қағаз біреу, ал ондағы мәндер екеу. Кортеж (tuple) — реті бекітілген бірнеше бөліктен тұратын бір мән; бөліктердің деректер түрі әртүрлі бола алады. Орын саны мен әр орынның түрі бағдарлама құрастырылғанда белгілі болады. Қағаз бейнесінің шегі: кортеждегі орындар өз атауымен емес, нөмірімен белгіленеді. Атаулы бөліктер керек болса, келесі сабақта құрылым жасаймыз.

Екі мән → жақша мен үтір → бір кортеж → функциядан қайтару → атауларға ажырату. Осы тізбекті кодқа қарамай айтып көріңіз. (String, u32) — кортеждің түрі: бірінші орында иесі бар String мәтіні, екіншісінде u32 бүтін саны тұрады. (title, minutes) сол ретпен мән құрайды. Үтір орындарды бөледі, дөңгелек жақша оларды біріктіреді. (u32, String) — орындары ауысқандықтан, басқа түр.

Бір мәннің екі бөлігі

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

first_task функциясындағы -> таңбасынан кейін бір қайтарылатын түр — (String, u32) жазылған. Соңғы жолда ; жоқ, сондықтан кортеж қайтады. let (title, minutes) = first_task(); жолындағы сол жақ үлгі кортежді ажыратады: бірінші орын title, екінші орын minutes атын алады. Бұл екі бөлек қайтарылатын мән емес; функция бір кортеж қайтарады.

fn first_task() -> (String, u32) {
    let title = String::from("Оқу");
    let minutes = 20;
    (title, minutes)
}

fn main() {
    let (title, minutes) = first_task();
    println!("{title}: {minutes} мин");
}
Оқу: 20 мин

String иелігі функциядан кортежге, одан title атауына өтті; бұл — 19-сабақтағы ереже. u32 саны көшіріле алады. Кортеж жақын тұрған қысқа есептеуде орындардың мағынасы анық болса ыңғайлы.

Орын нөмірлері

Бір бөлік қажет болса, кортеж атауынан кейін нүкте мен орын нөмірін жазыңыз: .0 — бірінші, .1 — екінші. Жиым индексі сияқты, санау нөлден басталады. Төмендегі бөлек мысалда 25 санынан кейінгі _u32 оның түрін ашық көрсетеді; сан түрлері 10-сабақта өткен. true — 11-сабақтағы логикалық мән. Кортеж минут саны мен үлгергенімізді білдіретін мәнді сақтайды.

fn main() {
    let report = (25_u32, true);
    println!("Минут: {}", report.0);
    println!("Үлгердік: {}", report.1);
}
Минут: 25
Үлгердік: true

Мұнда екі бөлік те оқылғанда көшіріледі. Ал .0 арқылы String алынса, мәтінге иелік жаңа айнымалыға ауысуы мүмкін; бұл мәтінді тегін көшірмейді. Екі бөлікті кортежде .2 орны жоқ. Келесі бөлек мысал E0609 қатесімен әдейі құрастырылмайды:

fn main() {
    let report = (20_u32, true);
    println!("{}", report.2);
}

(20, true) кортежін [20, true] жиымымен шатастырмаңыз: жиымның барлық бөлігінің түрі бірдей болуы керек. 14-сабақтағы бос жақша () — бөлігі жоқ кортеж әрі бірлік мән. Бір элементті кортеж үшін (20,) деп үтір жазылады; (20) тек жақшаға алынған сан.

Тірек сызбаны еске түсіріңіз

  1. (String, u32) қайтаратын функция неге бір мән қайтарады?
  2. .1 қай орынды алады?
  3. (20,) мен (20) несімен өзгеше?

Жауап: кортеж — біртұтас мән; .1 екінші орында; үтір бір бөлікті кортеж жасайды. Бетті жауып, «екі мән → бір кортеж → қайтару → ажырату» тізбегін айтып шығыңыз.

Тапсырма

Міндетті. plan() -> (String, u32) функциясы Серуен атауы мен 30 санын қайтарсын. main ішінде оларды title және minutes атауларына ажыратып, Серуен — 30 мин жолын шығарыңыз. Екі мән де дайын println! мәтінінен емес, функциядан келуі керек.

Шекараны тексеру. Қайтарылатын мәндердің орнын ауыстырып, жарияланған түрді өзгертпеңіз. Құрастырушының қатесін оқып, ретін қайта түзетіңіз.

Ишара

Функцияның соңғы өрнегі (String::from("Серуен"), 30) болсын. main ішіндегі = таңбасының сол жағына (title, minutes) жазыңыз.

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

fn plan() -> (String, u32) {
    (String::from("Серуен"), 30)
}

fn main() {
    let (title, minutes) = plan();
    println!("{title}{minutes} мин");
}
Серуен — 30 мин

Кортеж екі түрлі мәнді бірге ұстады, ал ажырату әр бөлікке түсінікті атау берді. Кортеждер туралы ресми тарау.

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

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

Пікірлер (0)

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