Shanraq.org Shanraq.org
Сілтеменің өмір сүру уақыты
IT

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

Сілтеменің өмір сүру уақыты

47-сабақ. Қайтарылған сілтеменің бастапқы дерекке байланысын түсіну.

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

Алдын ала: сілтемелер, тілімдер, жалпыланған түрлер. Дерек әзірге бағдарламаны іске қосқан кезде ғана тұрады.

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

Кітапхананың оқырман билеті кітапты кітапханада тұрған кезде алуға мүмкіндік береді. Сілтеме де өзгенің дерегіне жол ашады, бірақ сол деректің ғұмырын ұзартпайды. Сілтеменің өмір сүру уақыты — қарызға алынған деректі қолдануға болатын код бөлігі; компилятор оны деректің жасалған және қолданылған жерінен анықтайды. Ұқсатудың шегі: бұл сағатпен өлшенетін уақыт емес, кодтағы шекараларды тексеру.

кіріс сілтемелер → ортақ ‘a байланысы → шығыс сілтеме тек тиісті дерек бар кезде жарамды. fn longer<'a>(left: &'a str, right: &'a str) -> &'a str ішінде апостроф пен a әрпі сілтемелер арасындағы байланысты атайды; бұл жеке мән емес. Әріпті басқаға ауыстыруға болады. Бір атаудың қайталануы нәтиженің екі мүмкін дереккөзге де байланысты екенін көрсетеді. Бұл белгі деректі ұзағырақ сақтамайды. 45-сабақтағы қызметте сілтемемен берілген бір ғана кіріс болды, сондықтан байланысты компилятор өзі анықтады. Мұнда екі дереккөз бар, сол үшін атауын жазамыз.

Қауіпсіз код бөлігінде мәтін таңдаңыз

fn longer<'a>(left: &'a str, right: &'a str) -> &'a str {
    if left.len() >= right.len() {
        left
    } else {
        right
    }
}

fn main() {
    let short = String::from("іс");
    let result;
    {
        let long = String::from("дүкенге бару");
        result = longer(&short, &long);
        println!("{result}");
    }
    println!("{short}");
}
дүкенге бару
іс

result ішкі бұйра жақшалардың арасында қолданылады; сол кезде екі мәтін де бар. Ішкі бөлік аяқталғанда long жойылады. Бір шақыруда short таңдалса да, сол жерден кейін result қолдануға болмайды: қызмет басқа жолы long қайтаруы мүмкін. .len() байт санын есептейді; бұл көзге көрінетін әріп саны емес.

Қызмет ішінде жасалған мәтінге сілтемені сыртқа шығаруға болмайды. Келесі әдейі қате мысал E0515 қатесін көрсетеді: қызмет аяқталғанда мәтін жойылады. 'a атауы оны ұзағырақ сақтамайды.

error-code: E0515

fn dangling<'a>() -> &'a str {
    let text = String::from("temporary");
    text.as_str()
}

fn main() {}

Бетке қарамай жауап беріңіз

  1. Қайталанған 'a нені байланыстырады?
  2. Ол long дерегінің ғұмырын ұзарта ма?
  3. Ішкі бөлік біткен соң result неге жарамсыз?

Тапсырма

Міндетті. Ішкі бөліктен кейін chosen = longer(short.as_str(), "жоспар") жасап, оны шығарыңыз. Мәтіннің тікелей жазылған түрі бағдарлама бойы қолжетімді, ал short әлі бар. Нәтижені алдын ала болжаңыз. Ескі result мәнін сыртқа шығармаңыз.

Жауаптар

Жауаптарды көрсету

as_str() short мәтінін көшірмей көрсетеді. chosen мәнін main аяқталғанша ғана қолданыңыз.

fn longer<'a>(left: &'a str, right: &'a str) -> &'a str {
    if left.len() >= right.len() {
        left
    } else {
        right
    }
}

fn main() {
    let short = String::from("іс");
    let result;
    {
        let long = String::from("дүкенге бару");
        result = longer(&short, &long);
        println!("{result}");
    }
    println!("{short}");
    let chosen = longer(short.as_str(), "жоспар");
    println!("{chosen}");
}
дүкенге бару
іс
жоспар

Тексергеннен кейін

Қызмет ішінде жасалған String мәніне сілтеме қайтаруға компилятор рұқсат етпейді: қызмет аяқталғанда ол мән жойылады. Код бөліктері түсініксіз болса, 19-сабақты қайталаңыз. Өмір сүру уақыты туралы ресми тарау.

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

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

Пікірлер (0)

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