Menu
Coddy logo textTech

Methoden und Feldänderungen

Teil des Abschnitts Objektorientierte Programmierung der R-Journey von Coddy. Lektion 38 von 57.

Methoden gehören in die methods-Liste von setRefClass(). Innerhalb einer Methode sind die Felder einfache Namen, und <<- ändert ein Feld. Im Coddy-Runner gibt R einen Hinweis auf das optionale Paket codetools aus, wenn eine Klasse mit Methoden definiert wird. Daher solltest du die Definition in suppressMessages() einschließen:

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

Ausgabe:

[1] "count is 6"

.self ist das Objekt, auf dem die Methode aufgerufen wurde. Eine Methode, die mit invisible(.self) endet, gibt das Objekt zurück, sodass Aufrufe verkettet werden können:

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)

Ausgabe:

[1] 9

Die Methode initialize wird innerhalb von $new() ausgeführt. initFields(...) setzt die übergebenen Felder; anschließend kann die Methode den übrigen Feldern Standardwerte zuweisen. Methoden rufen einander über ihren Namen auf:

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)

Ausgabe:

[1] 20

Innerhalb einer Methode erstellt ein einfaches <- für einen Feldnamen eine lokale Variable mit diesem Namen und lässt das Feld unverändert. Verwende <<- für jede Änderung eines Feldes:

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)

Ausgabe:

[1] 1
challenge icon

Aufgabe

Einfach

Vervollständige die Referenzklasse Stack in Stack.R. Sie speichert ihre Elemente im Feld items (vom Typ character, das oberste Element zuletzt) und verfügt über vier Methoden:

  • push(x) fügt x oben hinzu und gibt invisible(.self) zurück, sodass Aufrufe verkettet werden können;
  • pop() entfernt das oberste Element und gibt es zurück oder gibt nothing zurück, wenn der Stack leer ist;
  • peek() gibt das oberste Element zurück, ohne es zu entfernen, oder nothing;
  • size() gibt die Anzahl der Elemente zurück.

Die Definition ist bereits in suppressMessages() eingeschlossen. Der bereitgestellte Code liest die Befehle push a b, pop und peek, fügt anschließend in einem verketteten Aufruf zwei weitere Elemente hinzu und gibt die Größe aus.

Dein Code gehört in Stack.R. main.R enthält den bereitgestellten Ein-/Ausgabecode und darf nicht bearbeitet werden.

Probier es selbst

source("Stack.R")

# Bereitgestellter Ein-/Ausgabe-Code: belasse ihn wie er ist
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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-R-Compiler