ПочатиПочніть безкоштовно

Керуємо потужністю

Активні зв'язування також можна використовувати для встановлення приватних полів. У такому разі функція зв'язування має приймати єдиний аргумент із назвою «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
___ <- ___
Редагувати та запускати код