Menu
Coddy logo textTech

Métodos padrão

Parte da seção Programação Orientada a Objetos do Journey de R da Coddy. Lição 8 de 57.

Quando nenhum método corresponde à classe, UseMethod() procura o método padrão, name.default. Ele é o fallback para todas as classes que o genérico não conhece:

describe <- function(x) UseMethod("describe")
describe.dog <- function(x) paste("a dog called", x$name)
describe.default <- function(x) "something I do not know"
rex <- structure(list(name = "Rex"), class = "dog")
car <- structure(list(), class = "car")
print(describe(rex))
print(describe(car))

Saída:

[1] "a dog called Rex"
[1] "something I do not know"

Sem um método padrão, chamar o genérico em uma classe desconhecida termina com um erro:

describe <- function(x) UseMethod("describe")
describe.dog <- function(x) paste("a dog called", x$name)
car <- structure(list(), class = "car")
describe(car)

Saída:

Error in UseMethod("describe") : 
  no applicable method for 'describe' applied to an object of class "car"
Calls: describe
Execution halted

Valores simples também fazem despacho. Um número sem um atributo de classe tem a classe implícita numeric, texto tem character, e TRUE tem logical, portanto métodos com esses nomes funcionam em vetores comuns:

describe <- function(x) UseMethod("describe")
describe.numeric <- function(x) paste("numbers adding up to", sum(x))
describe.character <- function(x) paste("words:", paste(x, collapse = " "))
describe.default <- function(x) "something else"
print(describe(c(1, 2, 3)))
print(describe(c("a", "b")))
print(describe(TRUE))

Saída:

[1] "numbers adding up to 6"
[1] "words: a b"
[1] "something else"

Um método padrão também pode recusar educadamente: stop() com uma mensagem que nomeia a classe, para que quem chamou saiba o que deu errado. class(x)[1] é a primeira classe do objeto:

area <- function(shape) UseMethod("area")
area.square <- function(shape) shape$side^2
area.default <- function(shape) {
  stop("cannot compute the area of a ", class(shape)[1], call. = FALSE)
}
for (s in list(structure(list(side = 2), class = "square"), structure(list(), class = "blob"))) {
  cat(tryCatch(area(s), error = function(e) conditionMessage(e)), "\n")
}

Saída:

4 
cannot compute the area of a blob 
challenge icon

Desafio

Fácil

Complete a função genérica describe(x) em Describe.R e seus métodos para vetores simples:

  • describe.numeric() retorna 3 numbers, sum 6.
  • describe.character() retorna 2 words, longest: apple (a primeira das palavras mais longas em caso de empate).
  • describe.logical() retorna 2 of 3 are TRUE.
  • describe.default() retorna something else.

O código fornecido lê linhas num 1,2,3, chr apple,kiwi, lgl TRUE,FALSE,TRUE ou qualquer outra palavra com valores, que ele transforma em uma lista. Ele imprime describe() para cada uma.

Seu código deve ficar em Describe.R. main.R contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

source("Describe.R")

# Código de entrada/saída fornecido: mantenha-o como está
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
  p <- strsplit(line, " ")[[1]]
  values <- strsplit(p[2], ",")[[1]]
  x <- switch(p[1],
    num = as.numeric(values),
    chr = values,
    lgl = as.logical(values),
    list(values))
  cat(describe(x), "\n", sep = "")
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de R online