1. Nauka
  2. /
  3. Kursy
  4. /
  5. Programowanie obiektowe z S3 i R6 w R

Connected

ćwiczenie

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.

Instrukcje

100 XP

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.