Rust: алғашқы қадамнан жеке жоспарлау құралына дейін 22-сабақ (барлығы 35)
String және &str: сақтау мен оқу
22-сабақ. Мәтінді сақтау үшін иелік ететін жолды, оқу үшін мәтін көрінісін таңдау.
Мәтін ИИ көмегімен аударылды.
Алдын ала: 9 және 18–21-сабақтар. String мәнінің ауысуы түсініксіз болса, 19-сабақты қайталаңыз.
Таныс бейне және тірек сызба
Өз дәптеріңіз жазбаларды сақтайды; ашық тұрған бет жазбаны оқуға мүмкіндік береді, бірақ ол екінші дәптерге айналмайды. String мәтінге иелік етеді және өзгертуге рұқсат болса, ұлғая алады. &str — бар мәтіннің ұзындығы белгілі тұтас бөлігіне иелік етпей, оны оқуға арналған көрініс. Бейненің шегі бар: мәтін литералының да түрі &str, бірақ оның дерегі бағдарламада тұрады және міндетті түрде String айнымалысына тиесілі емес.
Сақтау және өзгерту → String; оқу үшін қабылдау → &str; иесі бар кезде → көрініс жарамды. Бетті жапқан соң осы сызбаны еске түсіріңіз. "Демалыс" — &str литералы; String::from("Оқу") иелік ететін бөлек мәтін жасайды. .as_str() әдісі String ішіндегі толық мәтінді көшірмей, оны оқуға арналған &str береді. Нүкте 15-сабақтағы .len() сияқты әдісті шақырады.
Бір параметр, екі мәтін көзі
organizer жобасында бұрынғы src/main.rs файлын бөлек сақтап, оны келесі кодпен толық ауыстырыңыз. Cargo.toml бар бумада cargo run орындаңыз. Басқа файлдар мен тәуелділіктер өзгермейді. Үш жолды алдын ала болжаңыз; төменде тек бағдарлама нәтижесі берілген.
Іске қоспас бұрын шақыруларды оқыңыз: show_title(owned.as_str()) иесіндегі мәтіннің көрінісін береді, ал show_title(literal) дайын &str литералын береді. title: &str параметрі екі жағдайда да String иелігін алмай, мәтінді оқиды.
fn show_title(title: &str) {
println!("Атауы: {title}");
}
fn main() {
let owned = String::from("Оқу");
let literal: &str = "Демалыс";
show_title(owned.as_str());
show_title(literal);
println!("Сақталды: {owned}");
}
Атауы: Оқу
Атауы: Демалыс
Сақталды: Оқу
owned қайта қолданылады: функция оның иелігін алмады. Литерал бастапқы кодта жазылған және бағдарлама жұмыс істегенше қолжетімді. Ал owned.as_str() берген көріністі owned жоғалғаннан кейін қолдануға болмайды; компилятор жарамсыз сілтемені сақтатпайды.
Функцияға қай түрді таңдаймыз?
Функция атауды тек оқыса, &str көбіне &String түрінен көбірек мәтін көзін қабылдайды: литералды, .as_str() арқылы толық String мәнін және 23-сабақтағы жол бөлігін. Бұл &str жаңа өзгермелі жазбаны өзі сақтай алады деген сөз емес. Жоспарлау құралы шақыру аяқталғаннан кейін де атауды сақтауы керек болса, оған өз String мәні қажет; оны қалай беріп, сақтайтынымызды тапсырма түрін жасағанда қараймыз.
&str арқылы push_str шақыруға болмайды: ол оқу көрінісі. Келесі бөлек қате мысал E0599 береді — бұл түрдің ондай әдісі жоқ:
fn main() {
let owned = String::from("Жоспар");
let view = owned.as_str();
view.push_str("!");
}
Бастапқы мәтінді өзгерту үшін let mut owned иесі және 21-сабақтағы тиісті өзгермелі қатынау керек. Ескі оқу көрінісі арқылы өзгеріс жасамаймыз: мәтін өскенде ол жарамсыз болып қалуы мүмкін. &str кейін тек толық мәтін емес, оның бөлігі ретінде де кездеседі.
Түсінгеніңізді тексеріңіз
let owned = String::from("Оқу")жолынан кейін мәтін байттарына кім иелік етеді?owned.as_str()көшірме ме, әлде көрініс пе?show_title(literal)негеString::fromталап етпейді?
Тексеру: owned; мәтінді көшірмейтін көрініс; литералдың түрі қазірдің өзінде &str. Таңдау түсініксіз болса, дәптер бейнесін және оның шегін айтып көріңіз.
Тапсырма
Міндетті. show_task(title: &str, minutes: u32) функциясын жазыңыз. main ішінде иелік ететін Оқу мәтінін және Демалыс литералын жасаңыз; функцияны owned.as_str(), 15 және literal, 5 мәндерімен шақырыңыз. Соңынан Сақталды: Оқу шығарыңыз. Осы ретпен үш жол күтіледі. Басып шығару үшін иелік ететін мәтінді көшірмеңіз.
Өз деректеріңіз. Бір шақыру String, екіншісі литерал қолданатындай етіп атау мен минутты өзгертіңіз.
Көмек
Функция ішінде println!("{title}: {minutes} мин"); жазыңыз. Бірінші шақыруға .as_str() керек, екіншісіне керек емес. owned иелігі main ішінде қалады.
Өз бетіңізше орындағаннан кейінгі үлгі жауап
fn show_task(title: &str, minutes: u32) {
println!("{title}: {minutes} мин");
}
fn main() {
let owned = String::from("Оқу");
let literal: &str = "Демалыс";
show_task(owned.as_str(), 15);
show_task(literal, 5);
println!("Сақталды: {owned}");
}
Оқу: 15 мин
Демалыс: 5 мин
Сақталды: Оқу
Функция екі мәтін көзін де оқиды, ал main мәтін иелігін сақтайды. Жолдар туралы ресми түсіндірме.
Пікірлер (0)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.