Shanraq.org Shanraq.org
Әдістер: Task деректеріне қатысты әрекеттер
IT

Rust: алғашқы қадамнан жеке жоспарлау құралына дейін 28-сабақ (барлығы 35)

Әдістер: Task деректеріне қатысты әрекеттер

28-сабақ. Тапсырманы жасау, күйін оқу және аяқтауды құрылымға қатысты әрекеттермен орындау.

Мәтін ИИ көмегімен аударылды.

Алдын ала: 14, 20, 21 және 27-сабақтар. & пен &mut айырмасы ұмытылса, 21-сабақты қайталаңыз.

Таныс бейне және тірек сызба

Тапсырма парағында толтырылған орындармен қатар жасалатын әрекеттер де бар: күйін оқу, орындалды деп белгілеу. Әдіс (method) — белгілі бір түрге қатысты, сол түрдің нақты мәні арқылы шақырылатын функция. impl Task { ... } блогы осындай әрекеттерді Task түріне жинайды; impl сөзі жүзеге асыруды білдіреді. Ұқсатудың шегі: қағаз өздігінен әрекет етпейді, әдістің коды шақырылғанда ғана орындалады.

struct Taskimpl TaskTask::new(...)task.is_done()task.finish(). Сызбаны өз сөзіңізбен айтыңыз. impl ішіндегі self параметрі жоқ new функциясы түрге қатысты және Task::new(...) түрінде шақырылады; :: түрден функцияға баратын жолды көрсетеді, String::from(...) сияқты. Бұл — байланысқан функция, нақты дананың әдісі емес. Әдістің бірінші параметрі self болады: &self тапсырманы оқуға, &mut self өзгертуге қарызға алады. task.is_done() немесе task.finish() жазғанда Rust task мәнін бірінші параметр ретінде өзі береді.

Оқу және өзгерту

organizer жобасындағы бұрынғы src/main.rs файлын сақтап, оны толық ауыстырыңыз. Cargo.toml тұрған бумада cargo run орындаңыз. Басқа файл мен тәуелділік қажет емес. Нәтижені болжаңыз.

new атау мен минут санын қабылдап, done: false күйіндегі Task қайтарады. Task { title, minutes, done: false } ішіндегі : белгісі жоқ екі атау — қысқартылған жазылым: ол title: title, minutes: minutes дегенді білдіреді, өйткені параметр мен өріс атауы бірдей. Мұнда өзіміз білетін жарамды мәндер берілген; функция пайдаланушы деректерін әлі тексермейді. is_done көшірілетін bool мәнін қайтарады, тапсырманы өзгертпейді. finish өрісті өзгертетіндіктен, &mut self және өзгермелі task керек.

struct Task {
    title: String,
    minutes: u32,
    done: bool,
}

impl Task {
    fn new(title: String, minutes: u32) -> Task {
        Task {
            title,
            minutes,
            done: false,
        }
    }

    fn is_done(&self) -> bool {
        self.done
    }

    fn finish(&mut self) {
        self.done = true;
    }
}

fn main() {
    let mut task = Task::new(String::from("Оқу"), 20);
    println!(
        "{}: {} мин, орындалды {}",
        task.title,
        task.minutes,
        task.is_done()
    );
    task.finish();
    println!("Кейін: {}", task.is_done());
}
Оқу: 20 мин, орындалды false
Кейін: true

title мәтінінің иелігі жаңа данаға өтеді. finish нәтижесінің түрі -> таңбасымен көрсетілмеген, сондықтан 14-сабақтағы () мәнін қайтарады. &mut self арқылы қарызға алу шақыру соңында бітеді де, is_done қайта оқи алады.

Өзгермелі сілтеме алынбаса

Айнымалы mut деп жарияланбаса, өзгерту әдісі оған өзгермелі сілтеме ала алмайды. Келесі бөлек мысал E0596 қатесімен әдейі құрастырылмайды:

struct Task { done: bool }
impl Task {
    fn finish(&mut self) { self.done = true; }
}
fn main() {
    let task = Task { done: false };
    task.finish();
}

task алдына mut қою шақыруға рұқсат береді. Дегенмен әдістер иелік ережесін жоймайды: &self өрістерді өзгертпейді, &mut self шақыру кезінде тек өзіне ғана қатынауды талап етеді. Мұндағы new нөл минутқа тыйым салмайды. Мәнді толық тексеруді және қате себебін Result меңгергенде қосамыз.

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

  1. Неге new үшін Task::, ал finish үшін task. жазылады?
  2. Қай әдіске өзгермелі айнымалы қажет?
  3. Неге finish() соңынан is_done() шақыруға болады?

Жауап: new нақты дананы қабылдамайды; finish үшін &mut self керек; оның уақытша қарызы бітті. Тірек сызбаны жатқа қайталаңыз.

Тапсырма

Міндетті. Task { title: String, done: bool } жариялаңыз. impl Task ішінде new(title: String) -> Task, is_done(&self) -> bool және finish(&mut self) жазыңыз. Өзгермелі Серуен тапсырмасын жасап, Серуен: false жолын шығарыңыз. Оны аяқтап, Серуен: true жолын шығарыңыз. Екі күйді де әдіспен алыңыз.

Өзгеріс. Айнымалы алдындағы mut сөзін алып тастаңыз, қатені оқыңыз, содан кейін қайтарыңыз.

Ишара

new ішінде Task { title, done: false } жасаңыз. finish ішінде self.done = true; жазыңыз. task.is_done() әдісін task.finish() шақыруынан бұрын да, кейін де қолданыңыз.

Талпыныстан кейінгі үлгі жауап

struct Task {
    title: String,
    done: bool,
}

impl Task {
    fn new(title: String) -> Task {
        Task { title, done: false }
    }

    fn is_done(&self) -> bool {
        self.done
    }

    fn finish(&mut self) {
        self.done = true;
    }
}

fn main() {
    let mut task = Task::new(String::from("Серуен"));
    println!("{}: {}", task.title, task.is_done());
    task.finish();
    println!("{}: {}", task.title, task.is_done());
}
Серуен: false
Серуен: true

Деректер мен оларға қатысты әрекеттер енді бірге тұр. Әдістер туралы ресми тарау.

Алдыңғы сабақ · Мазмұны · Келесі сабақ

Мәтінде қате не теру қатесі кездессе, бізге айтыңыз

Пікірлер (0)

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