Menu
Coddy logo textTech

פונקציות גישה

חלק מהיחידה תכנות מונחה עצמים במסלול ה-R של Coddy. שיעור 19 מתוך 57.

כימוס פירושו שקוד אחר עובד עם אובייקט באמצעות פונקציות במקום לגשת ישירות לשדות שלו. getter קורא ערך, ו-setter משנה אותו. עבור רשימת S3, ה-setter מחזיר את העותק שהשתנה:

new_member <- function(name) structure(list(name = name), class = "member")
get_name <- function(p) p$name
set_name <- function(p, value) {
  p$name <- value
  p
}
p <- new_member("ada")
p <- set_name(p, "Ada Lovelace")
print(get_name(p))

פלט:

[1] "Ada Lovelace"

מאפשרי גישה מאפשרים לאובייקט לשנות את אופן אחסון הנתונים שלו בלי לשבור את הקוד שמשתמש בו. המדחום הזה מאחסן מעלות צלזיוס, ו-getter מחשב את המעלות בפרנהייט כשמבקשים זאת, כך שהקוד שקורא לו לעולם לא נחשף לשדה עצמו:

new_thermo <- function(c) structure(list(c = c), class = "thermo")
celsius <- function(t) t$c
fahrenheit <- function(t) t$c * 9 / 5 + 32
t <- new_thermo(25)
cat(celsius(t), fahrenheit(t))

פלט:

25 77

גם setters מובנים של R, כמו names(x) <- ..., הם פונקציות החלפה. פונקציה בשם "name<-" עם הפרמטרים x ו-value מאפשרת למי שקוראים לה לכתוב name(p) <- "Bo"; R קוראת לה ומשייכת את התוצאה בחזרה ל-p:

new_member <- function(name) structure(list(name = name), class = "member")
name <- function(p) p$name
"name<-" <- function(x, value) {
  x$name <- trimws(value)
  x
}
p <- new_member("ada")
name(p) <- "  Bo  "
print(name(p))

פלט:

[1] "Bo"

פונקציית getter של אובייקט סגירה מחזירה עותק של הנתונים הפרטיים. שינוי העותק הזה אינו משנה את האובייקט, ולכן הדרך היחידה לגשת אליו היא דרך הפונקציות של האובייקט עצמו:

make_list <- function() {
  items <- character(0)
  list(add = function(x) items <<- c(items, x),
       get_items = function() items)
}
todo <- make_list()
todo$add("milk")
mine <- todo$get_items()
mine[1] <- "HACKED"
print(todo$get_items())

פלט:

[1] "milk"
challenge icon

אתגר

קל

איש קשר הוא רשימת S3 מהמחלקה contact עם השדות name ו-email. השלימו את Contact.R:

  • new_contact(name, email) שומרת את כתובת האימייל לאחר הסרת הרווחים מסביבה ובאותיות קטנות.
  • פונקציות האחזור contact_name(x) ו-contact_email(x).
  • פונקציית ההחלפה "contact_email<-", ששומרת את כתובת האימייל החדשה לאחר הסרת הרווחים מסביבה ובאותיות קטנות, כך שהקוד שקורא לה יוכל לכתוב contact_email(c1) <- value.

הקוד שסופק קורא name,email, ולאחר מכן כתובות אימייל חדשות, ומדפיס Ada <ada@x.com> אחרי כל שינוי ואת שמות השדות המאוחסנים בסוף.

כתבו את הקוד שלכם ב-Contact.R. הקובץ main.R מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.

נסו בעצמכם

source("Contact.R")

# קוד קלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
p <- strsplit(input[1], ",")[[1]]
c1 <- new_contact(p[1], p[2])
cat(contact_name(c1), " <", contact_email(c1), ">\n", sep = "")
for (value in input[-1]) {
  contact_email(c1) <- value
  cat(contact_name(c1), " <", contact_email(c1), ">\n", sep = "")
}
cat("stored fields: ", paste(names(unclass(c1)), collapse = ", "), "\n", sep = "")
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר R אונליין