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

Статична електрика

Класи R6 можуть використовувати копіювання за посиланням для середовищ, щоб спільно використовувати поля між обʼєктами. Щоб це налаштувати, визначте приватне поле з назвою shared. Це поле задається кількома рядками. Воно має:

  • Створити нове середовище.
  • Присвоїти цьому середовищу всі спільні поля.
  • Повернути це середовище.

До спільних полів слід звертатися через активні привʼязування. Вони працюють так само, як і інші активні привʼязування, які ви вже бачили, але отримують поля з префіксом private$shared$.

R6Class(
  "Thing",
  private = list(
    shared = {
      e <- new.env()
      e$a_shared_field <- 123
      e
    }
  ),
  active = list(
    a_shared_field = function(value) {
      if(missing(value)) {
        private$shared$a_shared_field
      } else {
        private$shared$a_shared_field <- value
      }
    }
  )
)

Зверніть увагу: назва активного привʼязування має збігатися з назвою спільного поля, яке ви хочете зчитати або встановити; в наведеному вище прикладі обидва мають назву a_shared_field.

Ця вправа є частиною курсу

Об'єктно-орієнтоване програмування з S3 та R6 в R

Переглянути курс

Інструкції до вправи

Клас MicrowaveOven частково визначено за вас.

  • У приватному елементі класу MicrowaveOven оновіть поле з назвою shared.
    • Це поле має містити три рядки коду в дужках {}.
    • Спершу викличте new.env() (docs), щоб створити нове середовище з назвою e, потім …
    • Присвойте в e змінну з назвою safety_warning зі значенням "Warning. Do not try to cook metal objects.", потім …
    • Поверніть середовище.
  • Додайте активне привʼязування з назвою safety_warning, яке зчитує або встановлює приватне спільне поле safety_warning.
    • Визначте це як функцію всередині елемента active.
    • Вона приймає єдиний аргумент з назвою value.
    • Вона має зчитувати або встановлювати private$shared$safety_warning.
  • Створіть два обʼєкти MicrowaveOven з іменами a_microwave_oven та another_microwave_oven відповідно.
  • Змініть поле safety_warning в a_microwave_oven на "Warning. If the food is too hot you may scald yourself.".
  • Перегляньте поле safety_warning в another_microwave_oven, щоб переконатися, що його змінено.

Інтерактивна практична вправа

Спробуйте виконати цю вправу, доповнивши цей зразок коду.

# Complete the class definition
microwave_oven_factory <- R6Class(
  "MicrowaveOven",
  private = list(
    shared = {
      # Create a new environment named e
      ___
      # Assign safety_warning into e
      ___
      # Return e
      ___
    }
  ),
  active = list(
    # Add the safety_warning binding
    safety_warning = ___(___) {
      if(___(___)) {
        ___
      } else {
        ___ <- ___
      }
    }
  )
)

# Create two microwave ovens
a_microwave_oven <- ___
another_microwave_oven <- ___
  
# Change the safety warning for a_microwave_oven
___ <- "Warning. If the food is too hot you may scald yourself."
  
# Verify that the warning has change for another_microwave
___ 
Редагувати та запускати код