Rust: алғашқы қадамнан жеке жоспарлау құралына дейін 23-сабақ (барлығы 35)
Тілімдер: деректің бір бөлігін көшірмей алу
23-сабақ. Сандар жиынының бір бөлігін жаңа жиым жасамай функцияға беру.
Мәтін ИИ көмегімен аударылды.
Алдын ала: 13, 15 және 20–22-сабақтар. 1..3 шекаралары түсініксіз болса, 13-сабақты қайталаңыз.
Таныс бейне және тірек сызба
Қағаздағы тізімнің екі көрші жолын әріптесіңізге бүкіл парақты қайта көшірмей көрсете аласыз. Тілім (slice) — тізбектің тұтас бір бөлігіндегі элементтерге иелік етпей қатынайтын көрініс. Бейненің шегі бар: Rust тілімнің қолданылу мерзімін дерекпен байланыстырып, шекарасын тексереді; қағаз мұны істемейді.
Иесі → шекаралар → оқуға арналған тілім → функция → иесі сақталады. &[u32] — ұзындығы белгілі, бірақ түрінде нақты саны жазылмаған u32 сандар тізбегіне сілтеме. 15-сабақтағы [u32; 4] түрінен айырмасы — ұзындық түрдің ішінде көрсетілмейді. &minutes[1..3] индексі 1 және 2 элементтерді алады: 13-сабақтағы .. оң жақ шекараны қоспайды. Екі шекара да жарамды болуы керек.
Ортаңғы бөлікті есептеу
organizer жобасында бұрынғы src/main.rs файлын бөлек сақтап, оны мысалмен толық ауыстырыңыз. Cargo.toml бар бумада cargo run орындаңыз. Басқа файлдар мен тәуелділіктер өзгермейді. Нәтижені алдын ала болжаңыз; төменде Cargo хабарлары жоқ.
Кодқа дейін жаңа жерлерді оқыңыз. middle бастапқы жиымдағы екі санға ғана сілтейді. values: &[u32] түрі sum функциясына осындай тілімді қабылдатады. 0..values.len() нөлден ұзындыққа дейінгі индекстерді береді, бірақ ұзындықтың өзін қоспайды; сондықтан әр values[index] жарамды. u32 саны мән ретінде көшіріледі, ал функция үшін бүкіл жиым көшірілмейді.
fn sum(values: &[u32]) -> u32 {
let mut total: u32 = 0;
for index in 0..values.len() {
total = total + values[index];
}
total
}
fn main() {
let minutes: [u32; 4] = [10, 20, 15, 5];
let middle = &minutes[1..3];
println!("Ортаңғы бөлік: {}", sum(middle));
println!("Біріншісі: {}", minutes[0]);
}
Ортаңғы бөлік: 35
Біріншісі: 10
middle 20 мен 15 сандарын қамтиды. Ол minutes жиымынан ұзақ өмір сүре алмайды. middle беру жиым иелігін өткізбейді, сондықтан шақырудан кейін minutes[0] қолжетімді. &minutes[0..minutes.len()] арқылы бүкіл жиымның тілімін де алуға болады; функция оның ұзындығын алдын ала білмейді.
Шекара мен мерзім
Оң жақ шекара ұзындықтан асса, тілім жасау 15-сабақтағы жиым шекарасынан шығу сияқты бағдарламаны дүрбелеңмен (panic) тоқтатады. Төрт элементті жиымда &minutes[4..4] — жарамды бос тілім, ал &minutes[4..5] жарамсыз. Бос тілімді sum функциясына берсеңіз, бастапқы нөл нәтиже болып қалады.
Тілім — сілтеме, сондықтан иесінен ұзақ сақталмайды. Келесі бөлек бағдарлама E0597 қатесімен әдейі құрастырылмайды:
fn main() {
let view: &[u32];
{
let values = [10, 20];
view = &values[0..2];
}
println!("{}", view[0]);
}
values ішкі блокта аяқталады, ал view сыртта қолданылмақ. Иесін сыртқы блокқа шығарыңыз немесе тілімді ішкі блокта қолданып бітіріңіз. Тілімнің атауын ғана ауыстыру көмектеспейді.
22-сабақтағы &str да тілім, бірақ мәтіннің тілімі. Мәтін тілімінің шекарасы байтпен беріледі және UTF-8 таңбасының шекарасына сай болуы керек. Сондықтан жиымдағы сандық индекстерді сөзге сол күйі көшірмеңіз; егжей-тегжейін 25-сабақта көреміз.
Түсінгеніңізді тексеріңіз
&minutes[1..3]қандай элементтерді алады?sumнеге[u32; 4]емес,&[u32]қабылдайды?- Жиым жойылған соң тілімді қолдануға бола ма?
Тексеру: индекстері 1 және 2 элементтер; функция әртүрлі ұзындықтағы бөліктерді жиымды көшірмей алады; болмайды. Тірек сызбаны еске түсіріңіз.
Тапсырма
Міндетті. [5, 10, 15, 20] жиымы үшін sum(values: &[u32]) функциясын алғашқы екі және соңғы екі элементпен шақырыңыз. Алғашқылары: 15, Соңғылары: 35, содан кейін бастапқы жиымнан Барлық элемент: 4 шығарыңыз. Екі жаңа жиым жасамаңыз, дайын қосындыларды баспаңыз.
Шекара. Бос &minutes[0..0] тілімін тексеріңіз: қосынды нөл болуы тиіс. Кейін негізгі шешімді қайтарыңыз.
Көмек
&minutes[0..2] және &minutes[2..4] қолданыңыз; екеуін де бір функцияға беріңіз. Функция ішінде 0..values.len() арқылы өтіңіз.
Өз бетіңізше орындағаннан кейінгі үлгі жауап
fn sum(values: &[u32]) -> u32 {
let mut total: u32 = 0;
for index in 0..values.len() {
total = total + values[index];
}
total
}
fn main() {
let minutes: [u32; 4] = [5, 10, 15, 20];
println!("Алғашқылары: {}", sum(&minutes[0..2]));
println!("Соңғылары: {}", sum(&minutes[2..4]));
println!("Барлық элемент: {}", minutes.len());
}
Алғашқылары: 15
Соңғылары: 35
Барлық элемент: 4
Бір функция жиымның екі бөлігін өңдейді; иесі қолжетімді болып қалады. Тілімдер туралы ресми түсіндірме.
Пікірлер (0)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.