Menu
Coddy logo textTech

Metodi per i generics di base

Fa parte della sezione Programmazione orientata agli oggetti del percorso R di Coddy. Lezione 9 di 57.

Molte funzioni di base in R sono generiche S3: print(), format(), summary(), toString(), length(), as.character() e altre ancora. Aggiungere un metodo permette alla tua classe di funzionare con una funzione che ogni utente di R già conosce. summary.gradebook() fornisce un resoconto di un intero oggetto:

summary.gradebook <- function(object, ...) {
  paste0(length(object$marks), " marks, average ", mean(object$marks))
}
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
cat(summary(g), "\n")

Output:

3 marks, average 82 

Controlla i parametri del generico prima di scrivere il metodo: summary() chiama il suo primo argomento object, mentre toString() e format() lo chiamano x. toString() dovrebbe restituire una singola stringa:

toString.gradebook <- function(x, ...) paste(x$marks, collapse = " / ")
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
print(toString(g))

Output:

[1] "70 / 85 / 91"

Un metodo length() cambia il significato di length() per la classe. Una coda che memorizza i suoi elementi in un campo può indicare quanti elementi contiene, invece del numero di campi nell’elenco:

q <- structure(list(items = c("a", "b", "c"), name = "jobs"), class = "queue")
print(length(q))
length.queue <- function(x) length(x$items)
print(length(q))

Output:

[1] 2
[1] 3

Anche gli operatori sono generici. Un metodo chiamato "+.money", scritto tra virgolette a causa del simbolo, viene eseguito quando uno dei due lati di + è un oggetto money. Riceve i due lati come e1 e e2:

new_money <- function(amount) structure(list(amount = amount), class = "money")
"+.money" <- function(e1, e2) new_money(e1$amount + e2$amount)
"==.money" <- function(e1, e2) e1$amount == e2$amount
a <- new_money(5)
b <- new_money(7)
print((a + b)$amount)
print(a == b)

Output:

[1] 12
[1] FALSE
challenge icon

Sfida

Facile

Una pila conserva i suoi elementi nel campo items, con l’elemento in cima alla pila per ultimo. new_stack(), push() e pop() in Stack.R sono già forniti. Aggiungi tre metodi:

  • length.stack() restituisce il numero di elementi.
  • toString.stack() restituisce gli elementi dall’alto verso il basso, separati da | , oppure empty.
  • summary.stack() restituisce stack of 3, top: c, oppure stack of 0 quando la pila è vuota.

Il codice fornito legge i comandi push <item> e pop, poi stampa la lunghezza, toString() e summary().

Il tuo codice va inserito in Stack.R. main.R contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

source("Stack.R")

# Codice di input/output fornito: lascialo così com'è
input <- suppressWarnings(readLines(file("stdin")))
s <- new_stack()
for (cmd in input) {
  if (cmd == "pop") s <- pop(s) else s <- push(s, substring(cmd, 6))
}
cat("length: ", length(s), "\n", sep = "")
cat("items: ", toString(s), "\n", sep = "")
cat(summary(s), "\n", sep = "")
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore R online