Elektryczność statyczna
Klasy R6 mogą korzystać z zachowania środowisk polegającego na kopiowaniu przez referencję, aby współdzielić pola między obiektami. Aby to skonfigurować, zdefiniuj prywatne pole o nazwie shared. Jego definicja zajmuje kilka linii kodu. Pole powinno:
- Tworzyć nowe środowisko.
- Przypisywać do niego wszystkie współdzielone pola.
- Zwracać to środowisko.
Dostęp do współdzielonych pól powinien odbywać się za pośrednictwem aktywnych powiązań. Działają one tak samo jak inne aktywne powiązania, które już widziałeś(-aś), ale odwołują się do pól z użyciem prefiksu 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
}
}
)
)
Zwróć uwagę, że nazwa aktywnego powiązania musi być taka sama jak nazwa współdzielonego pola, które chcesz odczytać lub ustawić – w powyższym przykładzie obie mają nazwę a_shared_field.
To ćwiczenie jest częścią kursu
Programowanie obiektowe z S3 i R6 w R
Instrukcje do ćwiczenia
Klasa MicrowaveOven została częściowo zdefiniowana.
- W elemencie prywatnym klasy
MicrowaveOvenzaktualizuj pole o nazwieshared.- Pole to powinno zawierać trzy linie kodu ujęte w nawiasy klamrowe
{}. - Najpierw wywołaj
new.env()(dokumentacja), aby utworzyć nowe środowisko o nazwiee, następnie … - Przypisz do
ezmienną o nazwiesafety_warningz wartością"Warning. Do not try to cook metal objects.", a następnie … - Zwróć to środowisko.
- Pole to powinno zawierać trzy linie kodu ujęte w nawiasy klamrowe
- Dodaj aktywne powiązanie o nazwie
safety_warning, które odczytuje lub ustawia prywatne współdzielone polesafety_warning.- Zdefiniuj je jako funkcję wewnątrz elementu
active. - Przyjmuje jeden argument o nazwie
value. - Powinno odczytywać lub ustawiać
private$shared$safety_warning.
- Zdefiniuj je jako funkcję wewnątrz elementu
- Utwórz dwa obiekty
MicrowaveOveno nazwach odpowiednioa_microwave_ovenianother_microwave_oven. - Zmień pole
safety_warningobiektua_microwave_ovenna"Warning. If the food is too hot you may scald yourself.". - Sprawdź pole
safety_warningobiektuanother_microwave_oven, aby upewnić się, że zostało zmienione.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
# 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
___