גטרים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 11 מתוך 61.
עם שדות פרטיים, קוד חיצוני לא יכול לגשת ישירות לנתונים של המבנה שלך. אבל לפעמים צריך לאפשר לאחרים לקרוא את הנתונים בלי לתת להם אפשרות לשנות אותם. כאן נכנסות לתמונה מתודות גטר (getter).
getter הוא פשוט מתודה ציבורית שמחזירה הפניה לשדה פרטי:
// wallet.rs
pub struct Wallet {
balance: f64,
}
impl Wallet {
pub fn new(initial: f64) -> Wallet {
Wallet { balance: initial }
}
pub fn balance(&self) -> f64 {
self.balance
}
}
המתודה balance() מקבלת את &self (גישה לקריאה בלבד) ומחזירה את הערך של השדה הפרטי. ב-Rust, שמות של פונקציות גישה נגזרים בדרך כלל מהשדה עצמו: אין צורך בקידומת get_.
כעת קוד חיצוני יכול לקרוא את היתרה דרך המתודה:
// main.rs
mod wallet;
use wallet::Wallet;
fn main() {
let w = Wallet::new(100.0);
println!("Balance: {}", w.balance()); // עובד!
}
עבור שדות שמכילים נתונים בבעלותם כמו String, לעיתים קרובות תחזיר הפניה כדי להימנע מהעתקה מיותרת:
pub fn name(&self) -> &String {
&self.name
}
פעולות getter מעניקות לך גישת קריאה מבוקרת, תוך שמירה על הגנה על השדה עצמו. המבנה נשאר אחראי על הנתונים שלו: קוד חיצוני יכול להסתכל, אבל לא לגעת.
אתגר
קלבואו נבנה מערכת פרופילי משתמשים שמדגימה כיצד מתודות getter מספקות גישה מבוקרת לקריאה של נתונים פרטיים.
תיצרו שני קבצים כדי לארגן את הקוד:
profile.rs: הגדירו מבנהUserProfileעם שני שדות פרטיים:username(String) ו-age(u32). המבנה עצמו צריך להיות ציבורי, אבל השדות צריכים להישאר פרטיים. מימשו בנאי ציבוריnewשמקבל שם משתמש וגיל. לאחר מכן הוסיפו שתי מתודות getter:username: מחזירה הפניה לשם המשתמש (&String)age: מחזירה את ערך הגיל (u32)
main.rs: ייבאו את מודול הפרופיל, צרוUserProfileוהשתמשו במתודות getter כדי להדפיס את פרטי המשתמש.
זכרו שב-Rust נהוג לתת למתודות getter את שם השדה עצמו: אין צורך בקידומת get_. עבור שדות מסוג String, החזירו הפניה כדי להימנע מהעתקה מיותרת.
הפלט שלכם צריך להיות בדיוק בפורמט הזה:
Username: {username}
Age: {age}לדוגמה, אם תיצרו פרופיל עם שם המשתמש "alice" והגיל 25, הפלט יהיה:
Username: alice
Age: 25תקבלו שתי קלטים: שם המשתמש והגיל.
נסו בעצמכם
mod profile;
use profile::UserProfile;
fn main() {
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let username = input1.trim().to_string();
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let age: u32 = input2.trim().parse().expect("Failed to parse age");
// TODO: צרו UserProfile באמצעות הבנאי
// TODO: השתמשו במתודות ה-getter כדי להדפיס את שם המשתמש והגיל
// פורמט:
// שם משתמש: {username}
// גיל: {age}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מתודות והתנהגות
מבוא לבלוקי מימושהפרמטר selfמתודות ניתנות לשינויפונקציות משויכותבלוקי מימוש מרוביםשרשור מתודותסיכום – פעולות מלבן4פרויקט: חיית מחמד וירטואלית
הגדרת חיית המחמדהאכלת חיית המחמדתרגלו בעצמכם: קומפיילר Rust אונליין