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)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.