Kontrola mocy
Aktywnych powiązań można też używać do ustawiania prywatnych pól. W takim przypadku funkcja powiązania powinna przyjmować jeden argument o nazwie "value".
Szablon tworzenia aktywnego powiązania do odczytu i zapisu wygląda następująco.
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) # lub inne sprawdzenie
private$..a_field <- value
}
}
)
)
Wartości przypisuje się tak, jakby powiązanie było zwykłą zmienną z danymi, a nie funkcją.
a_thing <- thing_factory$new()
a_thing$a_field <- "a new value" # nie a_thing$a_field("a new value")
To ćwiczenie jest częścią kursu
Programowanie obiektowe z S3 i R6 w R
Instrukcje do ćwiczenia
Klasa kuchenki mikrofalowej została częściowo zdefiniowana.
- Rozszerz definicję klasy kuchenki mikrofalowej o element listy
active. - Dodaj aktywne powiązanie do elementu
active, które będzie kontrolować poziom mocy.- Funkcja powinna nazywać się
power_level_watts. - Powinna przyjmować jeden argument o nazwie
value. - Prywatna zmienna do pobierania i ustawiania wartości nazywa się
..power_level_watts. - Użyj
assert_is_a_number()(dokumentacja), aby sprawdzić, żevaluejest pojedynczą liczbą. - Użyj
assert_all_are_in_closed_range()(dokumentacja), aby sprawdzić, żevaluemieści się w zakresie od0do..power_rating_watts.
- Funkcja powinna nazywać się
- Utwórz obiekt kuchenki mikrofalowej i przypisz go do zmiennej
a_microwave_oven. - Pobierz poziom mocy.
- Spróbuj ustawić poziom mocy na wartość
"400"jako ciąg znaków. - Spróbuj ustawić poziom mocy na
1600. - Ustaw poziom mocy na
400.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
# 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
___ <- ___