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
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
activenella lista. - Aggiungi un binding attivo all'elemento
activeper 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 chevaluesia un singolo numero. - Usa
assert_all_are_in_closed_range()(docs) per verificare chevaluesia compreso tra0e..power_rating_watts.
- La funzione deve chiamarsi
- 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
___ <- ___