Sémantique de copie
Fait partie de la section Programmation orientée objet du Journey R de Coddy. Leçon 39 sur 57.
Les objets S3 et S4 sont des valeurs : une fonction qui en modifie un modifie sa propre copie. Les objets RC sont des références : l'objet de l'appelant est modifié. La même fonction se comporte différemment pour les deux types :
setClass("S4Box", slots = c(n = "numeric"))
RCBox <- setRefClass("RCBox", fields = list(n = "numeric"))
bump_s4 <- function(b) { b@n <- b@n + 1; invisible(b) }
bump_rc <- function(b) b$n <- b$n + 1
v <- new("S4Box", n = 1)
r <- RCBox$new(n = 1)
bump_s4(v)
bump_rc(r)
cat(v@n, r$n)Sortie :
1 2$copy() crée un nouvel objet indépendant avec les mêmes valeurs de champs. Modifier la copie ne modifie pas l’original :
Account <- setRefClass("Account", fields = list(balance = "numeric"))
a <- Account$new(balance = 100)
alias <- a
backup <- a$copy()
alias$balance <- 0
cat(a$balance, backup$balance)Sortie :
0 100Une liste peut contenir plusieurs fois le même objet RC. Modifier un élément modifie alors tous les éléments. Crée un nouvel objet pour chaque élément lorsqu’ils doivent être indépendants :
Counter <- setRefClass("Counter", fields = list(n = "numeric"))
one <- Counter$new(n = 0)
same <- list(one, one, one)
same[[1]]$n <- 5
fresh <- lapply(1:3, function(i) Counter$new(n = 0))
fresh[[1]]$n <- 5
cat(same[[3]]$n, fresh[[3]]$n)Résultat :
5 0identical(a, b) vaut TRUE pour deux noms du même objet RC, et FALSE pour une copie, même lorsque les champs sont encore égaux :
Account <- setRefClass("Account", fields = list(balance = "numeric"))
a <- Account$new(balance = 100)
b <- a
c2 <- a$copy()
cat(identical(a, b), identical(a, c2), c2$balance == a$balance)Sortie :
TRUE FALSE TRUEDéfi
FacileUn éditeur de texte conserve des points de sauvegarde. Déclarez la classe de référence Document dans Document.R avec le champ text (caractère) et une méthode type(s) qui ajoute s au texte. Écrivez ensuite checkpoint(doc), qui renvoie une copie indépendante du document.
La définition avec les méthodes est enveloppée dans suppressMessages(). Le code fourni commence par un point de sauvegarde, puis lit les commandes : save enregistre checkpoint(doc), undo revient à une copie du dernier point de sauvegarde, et toute autre ligne est saisie. Il affiche le texte et le texte enregistré après chaque commande ; ainsi, un point de sauvegarde ne doit jamais changer lorsque la saisie continue.
Votre code doit être placé dans Document.R. main.R contient le code fourni d’entrée/sortie et ne peut pas être modifié.
Essayez vous-même
source("Document.R")
# Code d'entrée/sortie fourni : le conserver tel quel
input <- suppressWarnings(readLines(file("stdin")))
doc <- Document$new(text = "")
saved <- checkpoint(doc)
for (cmd in input) {
if (cmd == "save") {
saved <- checkpoint(doc)
} else if (cmd == "undo") {
doc <- checkpoint(saved)
} else {
doc$type(cmd)
}
cat(cmd, " -> [", doc$text, "] saved [", saved$text, "]\n", sep = "")
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
1Bases de S3
Travailler avec les fichiersListes avec une classeFonctions constructricesMéthodes print et formatValidateurs et fonctions utilitairesRécapitulatif - Températures4Encapsulation dans R
Les fermetures comme objetsLes environnements comme objetsFonctions d’accèsProtéger l’étatRécapitulatif - Parcmètre2S3 : génériques et méthodes
Génériques et UseMethodMéthodes par défautMéthodes pour les génériques de baseNotions de base sur NextMethodRécapitulatif - Aires des formes5Classes S4
Définir des classes S4Slots et accèsVérifications de validitéMéthodes showRécapitulatif - Catalogue de produits8Classes de référence
Définition des classes de référenceMéthodes et mises à jour des champsSémantique de copieHéritage et callSuperRécapitulatif - File d’attente des tâches11Projet : gestion de bibliothèque
Livres et membresEmprunter des livres3Héritage S3
Vecteurs de classesOrdre de recherche des méthodesÉtendre avec NextMethodVérifier avec inherits()Récapitulatif - Paie du personnelEntraînez-vous par vous-même : Compilateur R en ligne