Zacznij terazZacznij za darmo

Kontrola mocy

Aktywnych powiązań można też używać do ustawiania prywatnych pól. W takim przypadku funkcja powiązania powinna przyjmować jeden argument o nazwie "value".

Szablon tworzenia aktywnego powiązania do odczytu i zapisu wygląda następująco.

thing_factory <- R6Class(
  "Thing",
  private = list(
    ..a_field = "a value"
  ),
  active = list(
    a_field = function(value) {
      if(missing(value)) {
        private$..a_field
      } else {
        assert_is_a_string(value) # lub inne sprawdzenie
        private$..a_field <- value
      }
    }
  )
)

Wartości przypisuje się tak, jakby powiązanie było zwykłą zmienną z danymi, a nie funkcją.

a_thing <- thing_factory$new()
a_thing$a_field <- "a new value" # nie a_thing$a_field("a new value")

To ćwiczenie jest częścią kursu

Programowanie obiektowe z S3 i R6 w R

Zobacz kurs

Instrukcje do ćwiczenia

Klasa kuchenki mikrofalowej została częściowo zdefiniowana.

  • Rozszerz definicję klasy kuchenki mikrofalowej o element listy active.
  • Dodaj aktywne powiązanie do elementu active, które będzie kontrolować poziom mocy.
    • Funkcja powinna nazywać się power_level_watts.
    • Powinna przyjmować jeden argument o nazwie value.
    • Prywatna zmienna do pobierania i ustawiania wartości nazywa się ..power_level_watts.
    • Użyj assert_is_a_number() (dokumentacja), aby sprawdzić, że value jest pojedynczą liczbą.
    • Użyj assert_all_are_in_closed_range() (dokumentacja), aby sprawdzić, że value mieści się w zakresie od 0 do ..power_rating_watts.
  • Utwórz obiekt kuchenki mikrofalowej i przypisz go do zmiennej a_microwave_oven.
  • Pobierz poziom mocy.
  • Spróbuj ustawić poziom mocy na wartość "400" jako ciąg znaków.
  • Spróbuj ustawić poziom mocy na 1600.
  • Ustaw poziom mocy na 400.

Interaktywne ćwiczenie praktyczne

Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.

# Add a binding for power rating
microwave_oven_factory <- R6Class(
  "MicrowaveOven",
  private = list(
    ..power_rating_watts = 800,
    ..power_level_watts = 800
  ),
  # Add active list containing an active binding
  ___ = ___(
    ___ = ___(___) {
      if(missing(___)) {
        # Return the private value
        ___
      } else {
        # Assert that value is a number
        ___
        # Assert that value is in a closed range from 0 to power rating
        ___
        # Set the private power level to value
        ___ <- ___
      }
    }
  )
)

# Make a microwave 
a_microwave_oven <- ___

# Get the power level
___

# Try to set the power level to "400"
___ <- ___

# Try to set the power level to 1600 watts
___ <- ___

# Set the power level to 400 watts
___ <- ___
Edytuj i uruchom kod