Rust: алғашқы қадамнан жеке жоспарлау құралына дейін 28-сабақ (барлығы 35)
Әдістер: Task деректеріне қатысты әрекеттер
28-сабақ. Тапсырманы жасау, күйін оқу және аяқтауды құрылымға қатысты әрекеттермен орындау.
Мәтін ИИ көмегімен аударылды.
Алдын ала: 14, 20, 21 және 27-сабақтар. & пен &mut айырмасы ұмытылса, 21-сабақты қайталаңыз.
Таныс бейне және тірек сызба
Тапсырма парағында толтырылған орындармен қатар жасалатын әрекеттер де бар: күйін оқу, орындалды деп белгілеу. Әдіс (method) — белгілі бір түрге қатысты, сол түрдің нақты мәні арқылы шақырылатын функция. impl Task { ... } блогы осындай әрекеттерді Task түріне жинайды; impl сөзі жүзеге асыруды білдіреді. Ұқсатудың шегі: қағаз өздігінен әрекет етпейді, әдістің коды шақырылғанда ғана орындалады.
struct Task → impl Task → Task::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 меңгергенде қосамыз.
Түсінгеніңізді тексеріңіз
- Неге
newүшінTask::, алfinishүшінtask.жазылады? - Қай әдіске өзгермелі айнымалы қажет?
- Неге
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)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.