Inizia subitoInizia gratis

Controlla la potenza

I binding attivi possono essere usati anche per impostare campi privati. In questo caso, la funzione di binding deve accettare un solo argomento, chiamato "value".

Il modello per creare un binding attivo in lettura/scrittura è il seguente.

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 un'altra asserzione
        private$..a_field <- value
      }
    }
  )
)

I valori si assegnano come se il binding fosse una variabile di dati, non una funzione.

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

Questo esercizio fa parte del corso

Programmazione orientata agli oggetti con S3 e R6 in R

Visualizza corso

Istruzioni dell'esercizio

Una classe per un forno a microonde è stata definita parzialmente per te.

  • Estendi la definizione della classe del microonde per includere un elemento active nella lista.
  • Aggiungi un binding attivo all'elemento active per controllare il livello di potenza.
    • La funzione deve chiamarsi power_level_watts.
    • Deve accettare un solo argomento chiamato value.
    • La variabile privata da leggere/scrivere si chiama ..power_level_watts.
    • Usa assert_is_a_number() (docs) per verificare che value sia un singolo numero.
    • Usa assert_all_are_in_closed_range() (docs) per verificare che value sia compreso tra 0 e ..power_rating_watts.
  • Crea un oggetto forno a microonde e assegnalo a a_microwave_oven.
  • Leggi il livello di potenza.
  • Prova a impostare il livello di potenza al valore "400", come stringa.
  • Prova a impostare il livello di potenza a 1600.
  • Imposta il livello di potenza a 400.

esercizio interattivo pratico

Prova questo esercizio completando questo codice di esempio.

# 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
___ <- ___
Modifica ed esegui il codice