Controlează puterea
Legăturile active pot fi folosite și pentru a seta câmpuri private. În acest caz, funcția de legătură trebuie să accepte un singur argument, numit „value".
Modelul pentru crearea unei legături active de citire/scriere este următorul.
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) # sau o altă verificare
private$..a_field <- value
}
}
)
)
Valorile se atribuie ca și cum legătura ar fi o variabilă de date, nu o funcție.
a_thing <- thing_factory$new()
a_thing$a_field <- "a new value" # nu a_thing$a_field("a new value")
Acest exercițiu face parte din cursul
Programare orientată pe obiecte cu S3 și R6 în R
Instrucțiuni pentru exercițiu
O clasă pentru un cuptor cu microunde a fost parțial definită pentru tine.
- Extinde definiția clasei cuptorului cu microunde pentru a include un element
activede tip listă. - Adaugă o legătură activă în elementul
activepentru a controla nivelul de putere.- Funcția trebuie să se numească
power_level_watts. - Trebuie să accepte un singur argument numit
value. - Variabila privată de citit/setat se numește
..power_level_watts. - Folosește
assert_is_a_number()(docs) pentru a verifica căvalueeste un număr simplu. - Folosește
assert_all_are_in_closed_range()(docs) pentru a verifica căvaluese află între0și..power_rating_watts.
- Funcția trebuie să se numească
- Creează un obiect cuptor cu microunde și atribuie-l variabilei
a_microwave_oven. - Citește nivelul de putere.
- Încearcă să setezi nivelul de putere la valoarea
"400", ca șir de caractere. - Încearcă să setezi nivelul de putere la
1600. - Setează nivelul de putere la
400.
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
# 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
___ <- ___