Kom igångKom igång gratis

Styr effektnivån

Aktiva bindningar kan också användas för att ange privata fält. I så fall ska bindningsfunktionen ta ett enda argument som heter "value".

Mönstret för att skapa en läs/skriv-aktiv bindning ser ut så här.

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) # eller ett annat påstående
        private$..a_field <- value
      }
    }
  )
)

Värden tilldelas som om bindningen vore en datavariabel, inte en funktion.

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

Den här övningen är en del av kursen

Objektorienterad programmering med S3 och R6 i R

Visa kurs

Övningsinstruktioner

En klass för mikrovågsugnar har delvis definierats åt dig.

  • Utöka definitionen av mikrovågsugnklassen med ett active-listelement.
  • Lägg till en aktiv bindning i active-elementet för att styra effektnivån.
    • Funktionen ska heta power_level_watts.
    • Den ska ta ett enda argument som heter value.
    • Den privata variabeln som ska hämtas/anges heter ..power_level_watts.
    • Använd assert_is_a_number() (docs) för att kontrollera att value är ett enskilt tal.
    • Använd assert_all_are_in_closed_range() (docs) för att kontrollera att value ligger mellan 0 och ..power_rating_watts.
  • Skapa ett mikrovågsugnsobjekt och tilldela det till a_microwave_oven.
  • Hämta effektnivån.
  • Försök att ange effektnivån till värdet "400" som en sträng.
  • Försök att ange effektnivån till 1600.
  • Ange effektnivån till 400.

Interaktiv övning med praktiskt arbete

Testa den här övningen genom att slutföra den här exempelkoden.

# 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
___ <- ___
Redigera och kör kod