Statisk elektricitet
R6-klasser kan utnyttja miljöers kopiera-via-referens-beteende för att dela fält mellan objekt. För att sätta upp detta definierar du ett privat fält med namnet shared. Det här fältet tar flera rader att definiera och ska:
- Skapa en ny miljö.
- Tilldela delade fält till den miljön.
- Returnera miljön.
De delade fälten ska nås via aktiva bindningar. Dessa fungerar på samma sätt som andra aktiva bindningar du har sett, men hämtar fälten med prefixet 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
}
}
)
)
Observera att namnet på den aktiva bindningen måste vara detsamma som namnet på det delade fält du vill hämta eller sätta – i exemplet ovan är båda a_shared_field.
Den här övningen är en del av kursen
Objektorienterad programmering med S3 och R6 i R
Övningsinstruktioner
En MicrowaveOven-klass har delvis definierats åt dig.
- I det privata elementet i klassen
MicrowaveOven, uppdatera fältet med namnetshared.- Det här fältet ska innehålla tre rader kod omslutna av klammerparenteser,
{}. - Börja med att anropa
new.env()(docs) för att skapa en ny miljö med namnete, sedan … - Tilldela en variabel i
emed namnetsafety_warningoch värdet"Warning. Do not try to cook metal objects.", sedan … - Returnera miljön.
- Det här fältet ska innehålla tre rader kod omslutna av klammerparenteser,
- Lägg till en aktiv bindning med namnet
safety_warningsom hämtar eller sätter det privata delade fältetsafety_warning.- Definiera den som en funktion inuti elementet
active. - Den tar ett enda argument med namnet
value. - Den ska hämta eller sätta
private$shared$safety_warning.
- Definiera den som en funktion inuti elementet
- Skapa två
MicrowaveOven-objekt med namnena_microwave_ovenrespektiveanother_microwave_oven. - Ändra fältet
safety_warningpåa_microwave_oventill"Warning. If the food is too hot you may scald yourself.". - Kontrollera fältet
safety_warningpåanother_microwave_ovenför att bekräfta att det har ändrats.
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
# 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
___