Menu
Coddy logo textTech

Metotlar ve Alan Güncellemeleri

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

Metotlar methods listesine, setRefClass() içine eklenir. Bir metodun içinde alanlar yalın adlardır ve <<- bir alanı değiştirir. Coddy çalıştırıcısında, metotlar içeren bir sınıf tanımlandığında R isteğe bağlı codetools paketi hakkında bir not yazdırır; bu nedenle tanımı suppressMessages() ile sarın:

Counter <- suppressMessages(setRefClass("Counter",
  fields = list(count = "numeric"),
  methods = list(
    add = function(n = 1) {
      count <<- count + n
    },
    report = function() paste("count is", count)
  )
))
c1 <- Counter$new(count = 0)
c1$add()
c1$add(5)
print(c1$report())

Çıktı:

[1] "count is 6"

.self, metodun çağrıldığı nesnedir. invisible(.self) ile biten bir metot nesneyi döndürür; böylece çağrılar zincirlenebilir:

Counter <- suppressMessages(setRefClass("Counter",
  fields = list(count = "numeric"),
  methods = list(
    add = function(n = 1) {
      count <<- count + n
      invisible(.self)
    }
  )
))
c1 <- Counter$new(count = 0)
c1$add(2)$add(3)$add(4)
print(c1$count)

Çıktı:

[1] 9

initialize yöntemi $new() içinde çalışır. initFields(...), kendisine geçirilen alanları ayarlar; ardından yöntem diğerlerine varsayılan değerler verebilir. Yöntemler birbirlerini adlarıyla çağırır:

Account <- suppressMessages(setRefClass("Account",
  fields = list(owner = "character", balance = "numeric"),
  methods = list(
    initialize = function(...) {
      initFields(...)
      if (length(balance) == 0) balance <<- 0
      invisible(.self)
    },
    deposit = function(x) balance <<- balance + x,
    deposit_twice = function(x) {
      deposit(x)
      deposit(x)
    }
  )
))
a <- Account$new(owner = "Ada")
a$deposit_twice(10)
print(a$balance)

Çıktı:

[1] 20

Bir metodun içinde, bir alan adına yapılan yalın <- ataması, bu ada sahip yerel bir değişken oluşturur ve alanı değiştirmeden bırakır. Bir alanda yapılacak her değişiklik için <<- kullanın:

Counter <- suppressMessages(setRefClass("Counter",
  fields = list(count = "numeric"),
  methods = list(
    broken = function() count <- count + 1,
    working = function() count <<- count + 1
  )
))
c1 <- Counter$new(count = 0)
c1$broken()
c1$broken()
c1$working()
print(c1$count)

Çıktı:

[1] 1
challenge icon

Görev

Kolay

Stack Referans Sınıfını Stack.R içinde tamamla. Öğelerini items alanında tutar (character, en üstteki son öğedir) ve dört yönteme sahiptir:

  • push(x), x öğesini üste ekler ve invisible(.self) döndürür; böylece ekleme işlemleri zincirlenebilir;
  • pop(), en üstteki öğeyi kaldırıp döndürür veya yığın boş olduğunda nothing döndürür;
  • peek(), en üstteki öğeyi kaldırmadan döndürür veya nothing döndürür;
  • size(), öğe sayısını döndürür.

Tanım zaten suppressMessages() ile sarılmıştır. Sağlanan kod push a b, pop ve peek komutlarını okur, ardından tek bir zincirlenmiş çağrıda iki öğe daha ekler ve boyutu yazdırır.

Kodun Stack.R dosyasına yazılmalıdır. main.R sağlanan giriş/çıkış kodunu içerir ve düzenlenemez.

Kendin dene

source("Stack.R")

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
s <- Stack$new()
for (cmd in input) {
  if (startsWith(cmd, "push ")) {
    items <- strsplit(substring(cmd, 6), " ")[[1]]
    for (it in items) s$push(it)
  } else if (cmd == "pop") {
    cat("popped ", s$pop(), "\n", sep = "")
  } else if (cmd == "peek") {
    cat("top ", s$peek(), "\n", sep = "")
  }
}
s$push("x")$push("y")
cat("size after two chained pushes: ", s$size(), "\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