Controla la potencia
Los active bindings también pueden usarse para asignar campos privados. En este caso, la función del binding debe aceptar un único argumento, llamado "value".
El patrón para crear un active binding de lectura/escritura es el siguiente.
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) # o cualquier otra aserción
private$..a_field <- value
}
}
)
)
Los valores se asignan como si el binding fuera una variable de datos, no una función.
a_thing <- thing_factory$new()
a_thing$a_field <- "a new value" # no a_thing$a_field("a new value")
Este ejercicio forma parte del curso
Programación orientada a objetos con S3 y R6 en R
Instrucciones del ejercicio
Tienes parcialmente definida una clase de microondas.
- Amplía la definición de la clase de microondas para incluir un elemento de lista
active. - Añade un active binding al elemento
activepara controlar el nivel de potencia.- La función debe llamarse
power_level_watts. - Debe aceptar un único argumento llamado
value. - La variable privada que se obtiene/asigna se llama
..power_level_watts. - Usa
assert_is_a_number()(docs) para comprobar quevaluees un único número. - Usa
assert_all_are_in_closed_range()(docs) para comprobar quevalueestá entre0y..power_rating_watts.
- La función debe llamarse
- Crea un objeto microondas y asígnalo a
a_microwave_oven. - Obtén el nivel de potencia.
- Intenta establecer el nivel de potencia al valor
"400", como cadena. - Intenta establecer el nivel de potencia a
1600. - Establece el nivel de potencia a
400.
ejercicio interactivo práctico
Prueba este ejercicio completando este código de ejemplo.
# 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
___ <- ___