Menu
Coddy logo textTech

Erişimci Fonksiyonlar

Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 19 / 57.

Kapsülleme, diğer kodların bir nesnenin alanlarına doğrudan erişmek yerine işlevler aracılığıyla nesneyle çalışması anlamına gelir. Bir getter bir değeri okur, setter ise onu değiştirir. Bir S3 listesi için setter, değiştirilen kopyayı döndürür:

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))

Çıktı:

[1] "Ada Lovelace"

Erişimci işlevler, nesnenin verileri saklama biçimini, onu kullanan kodu bozmadan değiştirmesine olanak tanır. Bu termometre Celsius değerini saklar ve bir getter istendiğinde Fahrenheit değerini hesaplar; böylece çağıranlar alanın kendisini hiçbir zaman görmez:

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))

Çıktı:

25 77

R'nin names(x) <- ... gibi kendi setter'ları replacement function'lardır. x ve value parametrelerine sahip "name<-" adlı bir işlev, çağıranların name(p) <- "Bo" yazmasına olanak tanır; R bu işlevi çağırır ve sonucu tekrar p'ye atar:

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))

Çıktı:

[1] "Bo"

Bir kapanış nesnesinin getter'ı, özel verilerin bir kopyasını döndürür. Bu kopyayı değiştirmek nesneyi değiştirmez; dolayısıyla nesneye erişmenin tek yolu nesnenin kendi işlevleridir:

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())

Çıktı:

[1] "milk"
challenge icon

Görev

Kolay

Bir kişi, name ve email alanlarına sahip, contact sınıfında bir S3 listesidir. Contact.R dosyasını tamamlayın:

  • new_contact(name, email), e-postayı boşlukları temizlenmiş ve küçük harfe dönüştürülmüş olarak saklar.
  • contact_name(x) ve contact_email(x) alıcı işlevlerini tanımlayın.
  • Yeni e-postayı boşlukları temizlenmiş ve küçük harfe dönüştürülmüş olarak saklayan "contact_email<-" değiştirme işlevini tanımlayın; böylece çağıranlar contact_email(c1) <- value yazabilir.

Sağlanan kod name,email değerini, ardından yeni e-postaları okur ve her değişiklikten sonra Ada <ada@x.com> değerini, en sonda da saklanan alan adlarını yazdırır.

Kodunuz Contact.R dosyasına gitmelidir. main.R sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

source("Contact.R")

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Tabanlı Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online R derleyicisi