Menu
Coddy logo textTech

NextMethod Temelleri

Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 10 / 57.

Bir metodun içinde NextMethod(), aynı genel işlev için sıradaki metodu aynı bağımsız değişkenlerle çağırır. Tek sınıfa sahip bir nesne için sıradaki metot varsayılan olandır; bu nedenle bir metot genel yanıtı yeniden kullanıp ona ekleme yapabilir:

describe <- function(x) UseMethod("describe")
describe.default <- function(x) paste("an object with", length(x), "fields")
describe.task <- function(x) paste0(NextMethod(), ", titled ", x$title)
t <- structure(list(title = "Buy milk", done = FALSE), class = "task")
print(describe(t))

Çıktı:

[1] "an object with 2 fields, titled Buy milk"

Bir nesne, c("urgent", "task") gibi bir vektörde birden fazla sınıfa sahip olabilir. Gönderim bunları sırayla dener ve ilk yöntemdeki NextMethod(), bir sonraki sınıfın yöntemine geçer:

describe <- function(x) UseMethod("describe")
describe.task <- function(x) paste("task:", x$title)
describe.urgent <- function(x) paste("URGENT", NextMethod())
fix <- structure(list(title = "Fix the leak"), class = c("urgent", "task"))
print(describe(fix))

Çıktı:

[1] "URGENT task: Fix the leak"

NextMethod(), yöntemin aldığı her bağı, sep gibi ek bağımsız değişkenler de dâhil olmak üzere iletir. Bir sonraki yöntem, bunları yeniden listelemenize gerek kalmadan aynı değerleri görür:

label <- function(x, sep = ": ") UseMethod("label")
label.default <- function(x, sep = ": ") paste0("item", sep, x$name)
label.box <- function(x, sep = ": ") paste0("[", NextMethod(), "]")
b <- structure(list(name = "tools"), class = "box")
print(label(b))
print(label(b, sep = " = "))

Çıktı:

[1] "[item: tools]"
[1] "[item = tools]"

Base R, bir vektör alt kümelendiğinde sınıfı korumak için NextMethod() kullanır. Varsayılan [ sınıfı kaldırır; bu nedenle bir "[.percent" yöntemi işin yapılmasını sağlar ve sınıfı geri ekler:

format.percent <- function(x, ...) paste0(unclass(x) * 100, "%")
"[.percent" <- function(x, i) structure(NextMethod(), class = "percent")
p <- structure(c(0.1, 0.25, 0.5), class = "percent")
print(format(p[2:3]))

Çıktı:

[1] "25%" "50%"
challenge icon

Görev

Kolay

Görevler ve acil görevler, iki dosyada bulunan iki sınıftır. Task.R içinde genel describe() işlevini, an item döndüren varsayılan yöntemi ve NextMethod() çağırıp başlığı ekleyerek an item: Buy milk döndüren describe.task() işlevini tamamlayın. Urgent.R içinde, NextMethod() çağırarak URGENT an item: Fix bug döndüren describe.urgent() işlevini tamamlayın.

Yapıcılar verilmiştir: acil bir görev c("urgent", "task") sınıfına sahiptir. Verilen kod, task Buy milk, urgent Fix bug veya başlığı olan başka herhangi bir sözcük içeren satırları okur; bunlar ilgili sınıftan birer nesneye dönüşür ve her biri için describe() yazdırılır.

Kodunuz Task.R ve Urgent.R dosyalarına yazılmalıdır. main.R verilen girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

source("Task.R")
source("Urgent.R")

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
  kind <- sub(" .*", "", line)
  title <- sub("^[a-z]+ ", "", line)
  t <- if (kind == "urgent") new_urgent(title) else if (kind == "task") new_task(title) else structure(list(title = title), class = kind)
  cat(describe(t), "\n", sep = "")
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Tabanlı Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online R derleyicisi