EmpezarEmpieza gratis

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

Ver curso

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 active para 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 que value es un único número.
    • Usa assert_all_are_in_closed_range() (docs) para comprobar que value está entre 0 y ..power_rating_watts.
  • 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
___ <- ___
Editar y ejecutar código