Shanraq.org Shanraq.org
Функциялар
IT

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

Функциялар

Сабақ 14. Есептеуді басып шығарудан бөліп, мәндердің берілуін түсіндіру.

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

Алдын ала: 1–13 сабақтар. Айнымалы түсініксіз болса, 9-сабаққа оралыңыз.

Бұл не үшін керек?

Бұған дейін fn main() жазып келдік. Енді өз есептеуімізге атау береміз. Функция (function) — кіріс мәндерімен шақырып, нәтиже алуға болатын атаулы код бөлігі. Бір әрекеттің рецепті сияқты: бір рет сипаттап, әртүрлі мөлшермен қолдануға болады. Бірақ функция бүкіл жобаны «түсінбейді», тек өзіне берілген және қолжетімді деректермен жұмыс істейді.

Қалған тапсырмалар санын есептеу мен оны экранға шығаруды ажыратамыз. Сонда есептеуді хабарламадан бөлек тексеру оңай болады. 11–12-сабақтағы шарттар мен блок мәндерін қолданамыз.

Мысалды іске қосу

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

Мысалға дейін функция жазылымын қараңыз. fn remaining(total: u32, done: u32) -> u32 ішіндегі жақшада атауы мен түрі бар параметрлер, яғни кіріс мәндерінің орындары берілген; үтір оларды бөледі. -> u32 осы түрдегі сан қайтарылатынын білдіреді. remaining(total, done) шақыруындағы нақты мәндер — аргументтер; олар параметрлерге ретімен түседі. Соңғы ; белгісінсіз өрнек 12-сабақтағы блок сияқты нәтиже береді. -> жазылмаған функция бұрынғы () мәнін қайтарады.

fn remaining(total: u32, done: u32) -> u32 {
    total - done
}

fn print_remaining(count: u32) {
    println!("Қалғаны: {count}");
}

fn main() {
    let total: u32 = 7;
    let done: u32 = 2;
    if done <= total {
        let count = remaining(total, done);
        print_remaining(count);
    } else {
        println!("Деректер қате");
    }
}
Қалғаны: 5

Талдау

fn функцияны жариялайды. remaining — өзіміз таңдаған атау, мағынасы «қалғаны». Жақшада параметрлер, яғни кіріс мәндерінің атаулары мен міндетті түрлері көрсетіледі. Үтір параметрлерді бөледі. -> u32 қайтарылатын нәтиженің түрін көрсетеді. Ирек жақшаның іші — функция денесі. Соңғы total - done өрнегі ; белгісінсіз жазылып, 12-сабақтағы блок мәні сияқты нәтиже береді.

Аргументтер — шақырғанда берілетін нақты мәндер. remaining(total, done) шақыруында шақырушы функцияның айнымалы мәндері беріледі. Бірінші аргумент бірінші параметрге, екіншісі екіншісіне түседі: атауларының бірдей болуы атау бойынша байланыс бар деген сөз емес. remaining(7, 2) деп те шақыруға болады. remaining функциясы main ішіндегі жергілікті айнымалыларды көрмейді; оның total және done параметрлері — өз атаулары. Әр шақырған сайын параметрлерге мәндер қайта беріледі.

Функцияны жариялау оның денесін орындамайды. Бағдарлама main арқылы басталып, шақыруға жетеді, шақырылған функцияны орындайды да, келесі әрекетке оралады. Осы файлда функцияларды main алдында да, кейін де жариялауға болады: жазылу реті шақырылу ретін белгілемейді. Қайта шақыру жергілікті санауышты өздігінен сақтамайды.

print_remaining(count) тек басып шығарады. -> ... болмаса, нәтиже түрі — 12-сабақтағы (). Экранға шығару — әрекет, қайтарылған сан емес. Жай функцияны шақырғанда ! жазылмайды; println! бұрынғыша макрос болып қалады.

Кіріс деректерге қойылатын талап

Біздің remaining функциясы done <= total болуын талап етеді. Бұл — алдын ала шарт (precondition): оны шақырушы код қамтамасыз етуі керек. Мұнда main шартты шақыруға дейін тексереді. u32 түрінің өзі бұл ережеге кепіл болмайды. remaining(2, 7) деп шақырмаңыз; қате деректі нөлдік қалдыққа айналдырып, мәселені жасырмаңыз. Кейін нәтиже жоқтығын немесе қатені ашық қайтаруды үйренеміз. Әзірге мысал осы талаппен шектеледі.

Ерте қайтару

return бүкіл бағдарламаны не тек if блогын емес, ағымдағы функция шақыруын бірден аяқтайды. Одан кейін қайтарылатын мән жазылады. Мына бөлек мысалда fits тапсырманың бос уақытқа сыятынын анықтайды; ережеміз бойынша нөл минуттық тапсырма қабылданбайды.

fn fits(minutes: u32, available: u32) -> bool {
    if minutes == 0 {
        return false;
    }
    minutes <= available
}

fn main() {
    println!("{}", fits(0, 30));
    println!("{}", fits(15, 30));
    println!("{}", fits(40, 30));
}
false
true
false

available — қолжетімді минут саны. Нөл болса, return false; орындалады. Басқа жағдайда соңғы салыстыру ; белгісінсіз нәтиже береді.

Жиі кездесетін қате

Функция u32 қайтаруы тиіс, бірақ ; салдарынан оның блогы () береді. Нәтижесі — E0308:

fn remaining(total: u32, done: u32) -> u32 {
    total - done;
}

fn main() {
    println!("{}", remaining(7, 2));
}

Соңғы өрнектен нүктелі үтірді алып тастаңыз немесе return total - done; деп жазыңыз. Аяқтаушы өрнек үшін бірінші тәсіл ықшам.

Тірек сызба

Аргументтер → параметрлер → дене → қайтарылатын мән → шақырушы код.

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

  1. Функция жарияланған сәтте орындала ма?
  2. -> ... жоқ функция не қайтарады?
  3. main функциясы remaining шақыруына дейін нені тексереді?

Тексеру: жоқ, шақыру керек; (); аяқталған тапсырмалар жалпы саннан аспауы тиіс. Параметр — жариялаудағы кіріс атауы, аргумент — шақыруда берілген мән.

Тапсырма

Міндетті. is_short(minutes: u32) -> bool функциясын жазыңыз: ұзақтығы 1-ден 15 минутқа дейінгі тапсырма қысқа болып саналсын. Функция жауапты басып шығармай, есептеп қайтарсын. main ішінде 0, 15, 16 аргументтерімен шақырып, нәтижелерін шығарыңыз: false, true, false.

Өзіңізді тексеріңіз. Параметр, аргумент және қайтарылатын түр қай жерде жазылған? Қосымша 1 мәнімен шақырыңыз: true шығуы тиіс. Әр жағдайға жеке функция жасамаңыз.

Көмек

minutes > 0 мен minutes <= 15 салыстыруларын && арқылы біріктіріңіз. Функцияның соңғы өрнегіне ; қоймаңыз. main ішінде алынған жауапты println! бос {} орнына беріңіз.

Өз бетіңізше орындағаннан кейінгі үлгі жауап

fn is_short(minutes: u32) -> bool {
    minutes > 0 && minutes <= 15
}

fn main() {
    println!("{}", is_short(0));
    println!("{}", is_short(15));
    println!("{}", is_short(16));
}
false
true
false

Тексеруге арналған дереккөз

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

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

Пікірлер (0)

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