Metody i aktualizacja pól
Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 38 z 57.
Metody umieszcza się na liście methods funkcji setRefClass(). Wewnątrz metody pola mają zwykłe nazwy, a <<- zmienia pole. W środowisku uruchomieniowym Coddy R wyświetla komunikat o opcjonalnym pakiecie codetools podczas definiowania klasy z metodami, dlatego opakuj definicję w suppressMessages():
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())Wynik:
[1] "count is 6".self to obiekt, na którym wywołano metodę. Metoda kończąca się na invisible(.self) zwraca obiekt, dzięki czemu wywołania można łączyć w łańcuch:
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)Wynik:
[1] 9Metoda initialize uruchamia się wewnątrz $new(). initFields(...) ustawia przekazane pola; następnie metoda może przypisać wartości domyślne pozostałym. Metody wywołują się nawzajem po nazwie:
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)Wynik:
[1] 20Wewnątrz metody zwykłe <- przypisane do nazwy pola tworzy zmienną lokalną o tej nazwie i pozostawia pole bez zmian. Używaj <<- przy każdej zmianie pola:
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)Wynik:
[1] 1Wyzwanie
ŁatwyUzupełnij klasę Reference Stack w pliku Stack.R. Przechowuje ona elementy w polu items (typ character, wierzchołek na końcu) i ma cztery metody:
push(x)dodajexna wierzchołek i zwracainvisible(.self), dzięki czemu wywołania push można łączyć;pop()usuwa i zwraca element z wierzchołka albo zwracanothing, gdy stos jest pusty;peek()zwraca element z wierzchołka bez usuwania go albonothing;size()zwraca liczbę elementów.
Definicja jest już opakowana w suppressMessages(). Dostarczony kod odczytuje polecenia push a b, pop i peek, a następnie dodaje jeszcze dwa elementy w jednym łączonym wywołaniu i wyświetla rozmiar.
Twój kod umieść w pliku Stack.R. Plik main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
source("Stack.R")
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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 = "")
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy S3
Praca z plikamiListy z klasąFunkcje konstruktoraMetody print i formatWalidatory i funkcje pomocniczePowtórzenie — temperatury4Enkapsulacja w R
Domknięcia jako obiektyŚrodowiska jako obiektyFunkcje dostępoweOchrona stanuPodsumowanie – parkometr2Generics i metody S3
Generics i UseMethodMetody domyślneMetody dla podstawowych genericsPodstawy NextMethodPowtórzenie — pola figur5Klasy S4
Definiowanie klas S4Sloty i dostępSprawdzanie poprawnościMetody wyświetlaniaPodsumowanie – katalog produktów8Klasy referencyjne
Definiowanie klas referencyjnychMetody i aktualizacja pólSemantyka kopiowaniaDziedziczenie i callSuperPodsumowanie – kolejka zadań11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książek3Dziedziczenie S3
Wektory klasKolejność wyszukiwania metodRozszerzanie za pomocą NextMethodSprawdzanie za pomocą inherits()Powtórzenie — lista płac pracownikówPoćwicz samodzielnie: Kompilator R online