Rust: алғашқы қадамнан жеке жоспарлау құралына дейін 18-сабақ (барлығы 20)
Мәндер және жад
Сабақ 18. Мәнді, оның иесін және дерек сақталатын орынды ажырату.
Мәтін ИИ көмегімен аударылды.
Алдын ала: 1–17-сабақтар. Атаудың қолданылу аясын ұмытсаңыз, 9-сабаққа; функция шақыруы түсініксіз болса, 14-сабаққа оралыңыз.
Жады туралы неге қазір айтамыз?
Сандық жиымды функцияға бергенде ерекше өзгеріс байқалмады. Ал ұзара алатын мәтін үшін деректі кім сақтайды деген сұрақ туады. Жад — жұмыс істеп тұрған бағдарлама деректерді сақтайтын орын. Буфер — мәтін байттары сияқты дерекке бөлінген аймақ; оның өлшемі өзгеруі мүмкін. Айнымалы — код мәнге қатынайтын атау. Оны бумадағы жапсырмаға ұқсатуға болады. Бірақ жапсырма әр байттың толық көшірмесі бар бөлек қорап емес. Бағдарлама нәтижесі өзгермесе, компилятор нақты орналасуды басқаша таңдай алады.
Тірек карта: атау → мән → қажет болса дерек буфері → иесі → қолданылу аясының соңы. Бетті жауып, тізбекті өзіңіз сызыңыз. Әр мәнге міндетті түрде бөлек буфер керек деп ойламаңыз.
Кодқа дейін жаңа жазылымды түсінейік
String — мәтін дерегіне иелік ететін және өсе алатын Rust түрі. String::from("Жоспар") мәтін литералынан осындай мән жасайды. Қатар тұрған екі қос нүкте :: String түріне байланысты функцияны таңдайды; екі мәтінді қоспайды. title.push_str(" бүгінге") title мәнінің соңына мәтін қосады. Нүкте 15-сабақтағы len() сияқты әдісті шақырады. let mut осы атау арқылы мәнді өзгертуге рұқсат береді; String түріндегі әр айнымалы өздігінен өзгермелі болмайды. Жол түрлерін 22-сабақта толық салыстырамыз.
6-сабақтағы organizer жобасында ескі src/main.rs мазмұнын бөлек сақтаңыз. Файлды келесі мысалмен толық ауыстырып, Cargo.toml бар бумада cargo run орындаңыз. Басқа файл да, тәуелділік те өзгермейді. Алдымен нәтижені болжаңыз; кодтан кейінгі блокта Cargo емес, бағдарлама шығарған мәтін берілген.
fn main() {
let fixed: [u32; 2] = [10, 15];
let mut title = String::from("Жоспар");
title.push_str(" бүгінге");
println!("{} және {} минут", fixed[0], fixed[1]);
println!("{title}");
}
10 және 15 минут
Жоспар бүгінге
Жиым мәнінде екі u32 саны бар, оның өлшемі алдын ала белгілі. String мәнінде мәтін туралы қызметтік дерек бар, ал мәтін байттары оған тиесілі буферде сақталады. Мәтін ұзарса, буферге үлкенірек орын берілуі мүмкін. Бұл түсінік жадтағы нақты мекенжайды уәде етпейді.
Стек, үйме және қолданылу аясы
Стек әдетте өлшемі алдын ала белгілі функция шақыруы деректеріне қолданылады. Үйме бағдарлама жүріп жатқанда қажетті өлшемдегі орын беруге мүмкіндік жасайды. Жұмыс бейнесі ретінде жиымды шақырудың жұмыс үстеліне, ал мәтін байттарын бөлек кеңейетін қоймаға ұқсатыңыз. Шегі: оңтайландыру нақты орналасуды өзгертуі мүмкін. Стек не үйме атауды мән берілгеннен кейін қолдануға болатынын өздігінен шешпейді; оны иелік ережелері шешеді.
Атаудың қолданылу аясы сәйкес жабушы ирек жақшада } аяқталады. Rust иелік ететін ресурсты қажеті қалмағанда өзі босатады; мәтін буферін қолмен босатпаймыз. Ішкі жақшадан кейін қай атау қолжетімді екенін болжаңыз:
fn main() {
let outer = 10;
{
let inner = String::from("жазба");
println!("{inner}: {outer}");
}
println!("Сыртқы мән: {outer}");
}
жазба: 10
Сыртқы мән: 10
Ішкі } таңбасы inner атауының аясын аяқтайды, ал outer қолжетімді. Кейін inner атауын қолдану E0425 қатесімен құрастырылмайды:
fn main() {
{
let inner = String::from("жазба");
println!("{inner}");
}
println!("{inner}");
}
Еске түсіру
push_str сандық жиым ұзындығын өзгерте ме? Ішкі блоктан кейін outer қолданыла ма? Стек пен үйменің суреті нақты мекенжай картасы ма? Жауап: жоқ; иә; жоқ. Соңғы жауаптың себебін өз сөзіңізбен айтыңыз.
Тапсырма
Міндетті. Тапсырма мәтіні бар String жасап, push_str арқылы : оқу қосыңыз. Ішкі блокта [5, 10] жиымын жасап, қосындысын шығарыңыз. Блоктан кейін мәтінді шығарыңыз. Кодқа дейін екі қолданылу аясын сызыңыз. Нәтиже: Минут: 15, одан кейін Тапсырма: оқу. cargo run орындап, ішкі жиымның атауы неге кейін қолжетімсіз екенін түсіндіріңіз.
Ишара
let mut title = String::from("Тапсырма"); жолын ішкі блокқа дейін жазыңыз. Жиымды блоктың ішіне орналастырыңыз. Сыртқы title блоктан кейін де көрінеді.
Өз талпынысыңыздан кейінгі үлгі
fn main() {
let mut title = String::from("Тапсырма");
title.push_str(": оқу");
{
let minutes = [5, 10];
println!("Минут: {}", minutes[0] + minutes[1]);
}
println!("{title}");
}
Минут: 15
Тапсырма: оқу
Келесі сабақта String мәнін басқа атауға бергенде не болатынын білеміз. Rust иелігі туралы ресми тарау.
Пікірлер (0)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.