Menu
Coddy logo textTech

Slotlar ve Erişim

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

obj@slot <- value bir slot'u değiştirir. S3 nesneleri gibi, S4 nesneleri de değerlerdir: Birini değiştiren bir işlev kendi kopyası üzerinde çalışır ve onu döndürür:

setClass("Person", slots = c(name = "character", age = "numeric"))
birthday <- function(p) {
  p@age <- p@age + 1
  p
}
ada <- new("Person", name = "Ada", age = 36)
older <- birthday(ada)
cat(ada@age, older@age)

Çıktı:

36 37

slot(obj, "name"), dize içindeki slot adıyla @ ile aynı işi yapar; bu nedenle bir değişkende tutulan adla çalışır. slotNames() bir sınıfın veya nesnenin slot'larını listeler:

setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
for (s in slotNames(ada)) cat(s, "=", format(slot(ada, s)), "\n")
slot(ada, "age") <- 37
print(ada@age)

Çıktı:

name = Ada 
age = 36 
[1] 37

Her atama yalnızca new() için değil, bildirilen türe karşı da kontrol edilir. Yanlış bir değer reddedilir ve nesne eski değerini korur:

setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
ada@age <- "old"

Çıktı:

Error in (function (cl, name, valueClass)  : 
  assignment of an object of class “character” is not valid for @‘age’ in an object of class “Person”; is(value, "numeric") is not TRUE
Execution halted

getSlots(), her yuva adını bildirilmiş türüyle birlikte döndürür; bu da kodun metin girdisini bir yuvanın beklediği türe dönüştürmesini sağlar:

setClass("Person", slots = c(name = "character", age = "numeric"))
types <- getSlots("Person")
print(types)
value <- "40"
if (types[["age"]] == "numeric") value <- as.numeric(value)
print(value + 1)

Çıktı:

       name         age 
"character"   "numeric" 
[1] 41
challenge icon

Görev

Kolay

Profile.R içindeki Profile sınıfı name ve city (karakter) ile age (sayısal) yuvalarına sahiptir. İki işlevi tamamlayın:

  • update_profile(p, field, value), alan bir yuva olmadığında no field email ile durur (call. = FALSE kullanın); aksi takdirde yuva sayısalsa metin value değerini as.numeric() ile dönüştürür, yuvayı slot() ile ayarlar ve değiştirilmiş profili döndürür.
  • profile_lines(p), yuva sırasına göre her yuva için bir satır döndürür: name: Ada.

Sağlanan kod bir ad okur, ardından city=Paris veya age=36 satırlarını okur, her birini uygular ve profilin satırlarını yazdırır.

Kodunuz Profile.R dosyasına yazılmalıdır. main.R sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

source("Profile.R")

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
p <- new("Profile", name = input[1], city = "unknown", age = 0)
for (line in input[-1]) {
  kv <- strsplit(line, "=")[[1]]
  p <- tryCatch(update_profile(p, kv[1], kv[2]), error = function(e) {
    cat("error: ", conditionMessage(e), "\n", sep = "")
    p
  })
}
for (l in profile_lines(p)) cat(l, "\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