Shanraq.org Shanraq.org
Тілімдер: деректің бір бөлігін көшірмей алу
IT

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-сабақта көреміз.

Түсінгеніңізді тексеріңіз

  1. &minutes[1..3] қандай элементтерді алады?
  2. sum неге [u32; 4] емес, &[u32] қабылдайды?
  3. Жиым жойылған соң тілімді қолдануға бола ма?

Тексеру: индекстері 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)

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