Wzorzec Iterator
Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 49 z 57.
Iterator udostępnia elementy kolekcji pojedynczo, dzięki czemu kod, który z nich korzysta, nie musi wiedzieć, jak przechowywana jest kolekcja. Domknięcie przechowuje pozycję; has_next() i next_value() stanowią cały interfejs:
make_iterator <- function(x) {
i <- 0
list(
has_next = function() i < length(x),
next_value = function() {
i <<- i + 1
x[[i]]
}
)
}
it <- make_iterator(c("a", "b", "c"))
while (it$has_next()) cat(it$next_value(), "")Wynik:
a b c Generator to iterator, który oblicza każdą wartość na żądanie, więc sekwencja nie musi istnieć w pamięci. Może być nawet nieskończony:
make_fib <- function() {
a <- 0
b <- 1
list(has_next = function() TRUE,
next_value = function() {
value <- a
nxt <- a + b
a <<- b
b <<- nxt
value
})
}
fib <- make_fib()
for (i in 1:10) cat(fib$next_value(), "")Wynik:
0 1 1 2 3 5 8 13 21 34 Iterator ukrywa układ. Wyniki przechowywane na stronach, z których niektóre są puste, tworzą jedną płaską sekwencję:
make_paged <- function(pages) {
p <- 1
i <- 0
skip_empty <- function() while (p <= length(pages) && i >= length(pages[[p]])) { p <<- p + 1; i <<- 0 }
list(
has_next = function() { skip_empty(); p <= length(pages) },
next_value = function() { skip_empty(); i <<- i + 1; pages[[p]][i] }
)
}
it <- make_paged(list(c("a", "b"), character(0), c("c")))
while (it$has_next()) cat(it$next_value(), "")Wynik:
a b c Funkcje pomocnicze napisane z myślą o interfejsie współpracują z każdym iteratorem. take(it, n) pobiera do n wartości z wektora, generatora lub dowolnego innego obiektu z has_next() i next_value():
make_iterator <- function(x) {
i <- 0
list(has_next = function() i < length(x), next_value = function() { i <<- i + 1; x[[i]] })
}
take <- function(it, n) {
out <- c()
while (length(out) < n && it$has_next()) out <- c(out, it$next_value())
out
}
it <- make_iterator(1:5)
print(take(it, 2))
print(take(it, 10))Wynik:
[1] 1 2
[1] 3 4 5Wyzwanie
ŁatwyUzupełnij Iterator.R:
make_iterator(x): iterator po elementach wektora, z metodamihas_next()inext_value();make_range(from, to, by): generator wartościfrom,from + by, ... aż dotowłącznie, obliczanych pojedynczo;take(it, n): pobiera maksymalnienkolejnych wartości z dowolnego iteratora.
Dostarczony kod odczytuje wiersze range 1 10 3 take 2 5 (from, to, by, a następnie rozmiary kolejnych wywołań take) lub list a,b,c take 2 2 i wypisuje wynik każdego wywołania take().
Umieść swój kod w Iterator.R. main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
source("Iterator.R")
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, " ")[[1]]
it <- if (p[1] == "range") make_range(as.numeric(p[2]), as.numeric(p[3]), as.numeric(p[4])) else make_iterator(strsplit(p[2], ",")[[1]])
k <- if (p[1] == "range") 5 else 3
for (n in as.numeric(p[-(1:k)])) {
got <- take(it, n)
cat("take ", n, ": ", if (length(got) == 0) "(nothing)" else paste(got, collapse = " "), "\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