Керуємо потужністю
Активні зв'язування також можна використовувати для встановлення приватних полів. У такому разі функція зв'язування має приймати єдиний аргумент із назвою «value».
Шаблон для створення активного зв'язування з читанням і записом такий.
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) # or another assertion
private$..a_field <- value
}
}
)
)
Значення призначаються так, ніби зв'язування є змінною даних, а не функцією.
a_thing <- thing_factory$new()
a_thing$a_field <- "a new value" # not a_thing$a_field("a new value")
Ця вправа є частиною курсу
Об'єктно-орієнтоване програмування з S3 та R6 в R
Інструкції до вправи
Клас мікрохвильової печі частково визначено за вас.
- Розширте визначення класу мікрохвильової печі, додавши елемент списку
active. - Додайте активне зв'язування до елемента
active, щоб керувати рівнем потужності.- Функцію слід назвати
power_level_watts. - Вона має приймати єдиний аргумент із назвою
value. - Приватна змінна для читання/запису називається
..power_level_watts. - Використайте
assert_is_a_number()(docs), щоб перевірити, щоvalue— це одне число. - Використайте
assert_all_are_in_closed_range()(docs), щоб перевірити, щоvalueміж0і..power_rating_watts.
- Функцію слід назвати
- Створіть об'єкт мікрохвильової печі та присвойте його змінній
a_microwave_oven. - Отримайте рівень потужності.
- Спробуйте встановити рівень потужності у значення
"400"як рядок. - Спробуйте встановити рівень потужності
1600. - Встановіть рівень потужності
400.
Інтерактивна практична вправа
Спробуйте виконати цю вправу, доповнивши цей зразок коду.
# 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
___ <- ___