Shanraq.org Shanraq.org
Оқу үшін қарызға алу
IT

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

Оқу үшін қарызға алу

Сабақ 20. Мәтінді функцияға оқуға беріп, иесінің оны кейін қолдануын сақтау.

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

Алдын ала: 1–19-сабақтар. Иеліктің ауысуы түсініксіз болса, 19-сабаққа оралыңыз. Қарызға алынған мәнді өзгертуді 21-сабақта қараймыз.

Тұрмыстық бейне және жаңа таңба

Досыңыз кітабыңызды оқығысы келсе, кітапты біржола берудің немесе екінші данасын сатып алудың қажеті жоқ: уақытша бере аласыз. Қарызға алу мәнге иелігін өткізбей уақытша қатынауға мүмкіндік береді. Бейненің шегі: Rust сілтеменің қашан қолданылатынын және қандай қатынаулар қатар жүре алатынын тексереді; күнделікті қарыз келісімі мұны сипаттамайды.

& таңбасы сілтеме жасайды: ол басқа мәнге жол көрсетеді, бірақ сол мәнге иелік етпейді. Шақырудағы &title title мәніне сілтеме жасайды. Параметр түріндегі &String функция String мәніне тек оқуға арналған сілтемені қабылдайтынын көрсетеді. Бір таңбаның екі орны бір-біріне байланысты: сілтемені жасау және оның түрін атау. Сілтеме мәтін буферінің иесі болмайды.

Тірек карта: иесі → & → оқуға арналған сілтеме → функция → иесі жұмысын жалғастырады. Кодты бастамас бұрын осы жолды жатқа түсіндіріңіз.

Иелікті бермей оқу

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

fn show_title(title: &String) {
    println!("Функцияда: {title}");
}

fn main() {
    let title = String::from("Оқу");
    show_title(&title);
    println!("Шақырудан кейін: {title}");
}
Функцияда: Оқу
Шақырудан кейін: Оқу

Шақыру сілтеме жасайды, ал параметр оны алады. main ішіндегі иесі String мәнін сақтайды, сондықтан функциядан кейін title қайта қолданылады. Бұл — өзгермейтін қарызға алу: функция сілтеме арқылы оқи алады, бірақ мәтінді өзгерте алмайды. «Өзгермейтін» сөзі осы сілтеме арқылы қатынауға қатысты; иесі кейін өз мәнін өзгерте алады.

Оқу қатынауының шегі

push_str String мәтінін өзгертеді. Оны тек оқуға арналған &String арқылы шақыру E0596 қатесін береді:

fn change(title: &String) {
    title.push_str("!");
}

fn main() {
    let title = String::from("Оқу");
    change(&title);
}

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

fn main() {
    let mut title = String::from("Жоспар");
    let view = &title;
    println!("Бұрын: {view}");
    title.push_str("!");
    println!("Кейін: {title}");
}
Бұрын: Жоспар
Кейін: Жоспар!

Құрастырылады, себебі view соңғы рет push_str алдында қолданылған. Өзгерістен кейін view атауын тағы басып шығаруға тырыссаңыз, Rust кодты қабылдамайды. Сілтеменің иесімен байланысын 23 және 47-сабақтарда тереңдетеміз.

Еске түсіру

Неге main бұл жерде title мәнін сақтайды, ал 19-сабақтағы String мәнін тікелей беру кезінде сақтамайды? &String арқылы push_str шақыруға бола ма? Жауап: сілтеме иелікті ауыстырмайды; жоқ, осы сілтеме арқылы өзгертуге болмайды.

Тапсырма

Міндетті. show_task(title: &String, minutes: u32) функциясын жазып, Оқу — 15 мин шығарыңыз. main ішінде Оқу мәтінін жасаңыз, функцияны 15 және 20 мәндерімен екі рет шақырыңыз, соңынан Атау сақталды: Оқу шығарыңыз. Үш жолды алдын ала болжаңыз. clone() қолданбаңыз және String мәнін тікелей бермеңіз. Құрастыру өтпесе, & таңбасының параметр түрінде де, шақыруда да барын тексеріңіз.

Ишара

u32 мәні Copy болғандықтан тікелей беріледі; мәтінді &title деп беріңіз. Функция ішінде println!("{title} — {minutes} мин"); қолданыңыз.

Өз талпынысыңыздан кейінгі үлгі

fn show_task(title: &String, minutes: u32) {
    println!("{title}{minutes} мин");
}

fn main() {
    let title = String::from("Оқу");
    show_task(&title, 15);
    show_task(&title, 20);
    println!("Атау сақталды: {title}");
}
Оқу — 15 мин
Оқу — 20 мин
Атау сақталды: Оқу

Картаны тағы бір рет жатқа түсіндіріңіз: иесі main ішінде қалады, ал функция уақытша оқуға қатынайды. Rust сілтемелері туралы ресми тарау.

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

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

Пікірлер (0)

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