Zacznij terazZacznij za darmo

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

Zobacz kurs

Instrukcje do ćwiczenia

Klasa MicrowaveOven została częściowo zdefiniowana.

  • W elemencie prywatnym klasy MicrowaveOven zaktualizuj pole o nazwie shared.
    • Pole to powinno zawierać trzy linie kodu ujęte w nawiasy klamrowe {}.
    • Najpierw wywołaj new.env() (dokumentacja), aby utworzyć nowe środowisko o nazwie e, następnie …
    • Przypisz do e zmienną o nazwie safety_warning z wartością "Warning. Do not try to cook metal objects.", a następnie …
    • Zwróć to środowisko.
  • Dodaj aktywne powiązanie o nazwie safety_warning, które odczytuje lub ustawia prywatne współdzielone pole safety_warning.
    • Zdefiniuj je jako funkcję wewnątrz elementu active.
    • Przyjmuje jeden argument o nazwie value.
    • Powinno odczytywać lub ustawiać private$shared$safety_warning.
  • Utwórz dwa obiekty MicrowaveOven o nazwach odpowiednio a_microwave_oven i another_microwave_oven.
  • Zmień pole safety_warning obiektu a_microwave_oven na "Warning. If the food is too hot you may scald yourself.".
  • Sprawdź pole safety_warning obiektu another_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
___ 
Edytuj i uruchom kod