Aan de slagGa gratis aan de slag

Regel het vermogen

Active bindings kunnen ook worden gebruikt om private velden te zetten. In dat geval moet de bindende functie één argument accepteren met de naam "value".

Het patroon voor het maken van een read/write active binding is als volgt.

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) # of een andere assertion
        private$..a_field <- value
      }
    }
  )
)

Waarden worden toegewezen alsof de binding een datavariabele is, niet een functie.

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

Deze oefening maakt deel uit van de cursus

Objectgeoriënteerd programmeren met S3 en R6 in R

Cursus bekijken

Oefeninstructies

Er is al een magnetronklasse deels voor je gedefinieerd.

  • Breid de definitie van de magnetronklasse uit met een active-lijstelement.
  • Voeg aan het active-element een active binding toe om het vermogensniveau te regelen.
    • De functie moet power_level_watts heten.
    • Deze moet één argument accepteren met de naam value.
    • De private variabele om op te halen/in te stellen heet ..power_level_watts.
    • Gebruik assert_is_a_number() (docs) om te controleren dat value een enkel getal is.
    • Gebruik assert_all_are_in_closed_range() (docs) om te controleren dat value tussen 0 en ..power_rating_watts ligt.
  • Maak een magnetronobject en wijs het toe aan a_microwave_oven.
  • Haal het vermogensniveau op.
  • Probeer het vermogensniveau te zetten op de waarde "400", als string.
  • Probeer het vermogensniveau te zetten op 1600.
  • Zet het vermogensniveau op 400.

Praktische interactieve oefening

Probeer deze oefening eens door deze voorbeeldcode in te vullen.

# 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
___ <- ___
Code bewerken en uitvoeren