Statische Elektrizität
R6-Klassen können das Copy-by-Reference-Verhalten von Environments nutzen, um Felder zwischen Objekten zu teilen. Richte das ein, indem du ein privates Feld namens shared definierst. Dieses Feld umfasst mehrere Zeilen und sollte:
- Ein neues Environment erstellen.
- Alle geteilten Felder diesem Environment zuweisen.
- Das Environment zurückgeben.
Auf die geteilten Felder wird über aktive Bindungen zugegriffen. Diese funktionieren genauso wie andere aktive Bindungen, die du bereits gesehen hast, holen die Felder aber mit dem Präfix private$shared$.
R6Class(
"Thing",
private = list(
shared = {
e <- new.env()
e$a_shared_field <- 123
e
}
),
active = list(
a_shared_field = function(value) {
if(missing(value)) {
private$shared$a_shared_field
} else {
private$shared$a_shared_field <- value
}
}
)
)
Beachte, dass der Name der aktiven Bindung derselbe sein muss wie der Name des geteilten Feldes, das du lesen oder setzen willst; im obigen Beispiel heißen beide a_shared_field.
Diese Übung ist Teil des Kurses
Objektorientierte Programmierung mit S3 und R6 in R
Anleitung zur Übung
Eine MicrowaveOven-Klasse wurde bereits teilweise für dich definiert.
- Aktualisiere im privaten Element der Klasse
MicrowaveOvendas Feldshared.- Dieses Feld soll drei Codezeilen in geschweiften Klammern
{}enthalten. - Zuerst soll es
new.env()(Docs) aufrufen, um ein neues Environment namensezu erstellen, dann … - Weise in
eeine Variable namenssafety_warningzu, mit dem Wert"Warning. Do not try to cook metal objects.", dann … - Gib das Environment zurück.
- Dieses Feld soll drei Codezeilen in geschweiften Klammern
- Füge eine aktive Bindung namens
safety_warninghinzu, die das private geteilte Feldsafety_warningliest oder setzt.- Definiere diese als Funktion innerhalb des Elements
active. - Sie nimmt ein einzelnes Argument namens
value. - Sie soll
private$shared$safety_warninglesen oder setzen.
- Definiere diese als Funktion innerhalb des Elements
- Erzeuge zwei Objekte der Klasse
MicrowaveOvenmit den Namena_microwave_ovenundanother_microwave_oven. - Ändere das Feld
safety_warningvona_microwave_ovenzu"Warning. If the food is too hot you may scald yourself.". - Sieh dir das Feld
safety_warningvonanother_microwave_ovenan, um sicherzugehen, dass es geändert wurde.
Interaktive Übung
Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.
# Complete the class definition
microwave_oven_factory <- R6Class(
"MicrowaveOven",
private = list(
shared = {
# Create a new environment named e
___
# Assign safety_warning into e
___
# Return e
___
}
),
active = list(
# Add the safety_warning binding
safety_warning = ___(___) {
if(___(___)) {
___
} else {
___ <- ___
}
}
)
)
# Create two microwave ovens
a_microwave_oven <- ___
another_microwave_oven <- ___
# Change the safety warning for a_microwave_oven
___ <- "Warning. If the food is too hot you may scald yourself."
# Verify that the warning has change for another_microwave
___