Electricitate statică
Clasele R6 pot folosi comportamentul de copiere prin referință al mediilor pentru a partaja câmpuri între obiecte. Pentru a configura acest lucru, definește un câmp privat numit shared. Acest câmp necesită mai multe linii de cod și ar trebui să:
- Creeze un mediu nou.
- Atribuie câmpurile partajate acelui mediu.
- Returneze mediul.
Câmpurile partajate ar trebui accesate prin intermediul legărilor active. Acestea funcționează la fel ca celelalte legări active pe care le-ai văzut, dar preiau câmpurile folosind prefixul 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
}
}
)
)
Reține că numele legării active trebuie să fie același cu numele câmpului partajat pe care vrei să îl obții sau să îl setezi; în exemplul de mai sus, ambele sunt a_shared_field.
Acest exercițiu face parte din cursul
Programare orientată pe obiecte cu S3 și R6 în R
Instrucțiuni pentru exercițiu
O clasă MicrowaveOven a fost parțial definită pentru tine.
- În elementul privat al clasei
MicrowaveOven, actualizează câmpul numitshared.- Acest câmp ar trebui să conțină trei linii de cod cuprinse între acolade,
{}. - Mai întâi, apelează
new.env()(docs) pentru a crea un mediu nou numite, apoi … - Atribuie în
eo variabilă numităsafety_warning, cu valoarea"Warning. Do not try to cook metal objects.", apoi … - Returnează mediul.
- Acest câmp ar trebui să conțină trei linii de cod cuprinse între acolade,
- Adaugă o legare activă numită
safety_warningcare obține sau setează câmpul privat partajatsafety_warning.- Definește-o ca funcție în interiorul elementului
active. - Primește un singur argument numit
value. - Ar trebui să obțină sau să seteze
private$shared$safety_warning.
- Definește-o ca funcție în interiorul elementului
- Creează două obiecte
MicrowaveOven, numitea_microwave_ovenși respectivanother_microwave_oven. - Modifică câmpul
safety_warningal obiectuluia_microwave_ovenla"Warning. If the food is too hot you may scald yourself.". - Verifică câmpul
safety_warningal obiectuluianother_microwave_ovenpentru a te asigura că a fost modificat.
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
# 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
___