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
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_wattsheten. - 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 datvalueeen enkel getal is. - Gebruik
assert_all_are_in_closed_range()(docs) om te controleren datvaluetussen0en..power_rating_wattsligt.
- De functie moet
- 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
___ <- ___