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

Це кінець (життєвого циклу об'єкта R6)

Так само як клас R6 може визначати публічний метод initialize() для виконання власного коду під час створення об'єктів, він може визначати і публічний метод finalize() для виконання коду під час знищення об'єктів. finalize() не повинен приймати аргументів. Його зазвичай використовують, щоб закривати з'єднання з базами даних або файлами, або скасовувати побічні ефекти, як-от зміну глобальних параметрів options() (docs) чи графічних параметрів par() (docs).

Шаблон коду має такий вигляд.

thing_factory <- R6Class(
  "Thing",
  public = list(
    initialize = function(x, y, z) {
      # do something
    },
    finalize = function() {
      # undo something
    }
  )
)

Метод finalize() викликається, коли об'єкт вилучається з пам'яті автоматичним збирачем сміття R. Ви можете примусово запустити збирання сміття, ввівши gc() (docs).

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

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

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

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

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

# Microwave_factory is predefined
microwave_oven_factory

# Complete the class definition
smart_microwave_oven_factory <- R6Class(
  "SmartMicrowaveOven",
  inherit = ___, # Specify inheritance
  private = list(
    # Add a field to store connection
    ___ = ___
  ),
  public = list(
    initialize = function() {
      # Connect to the database
      ___$___ = ___(___(), "___")
    },
    get_cooking_time = function(food) {
      dbGetQuery(
        private$conn,
        sprintf("SELECT time_seconds FROM cooking_times WHERE food = '%s'", food)
      )
    },
    finalize = function() {
      # Print a message
      ___("___")
      # Disconnect from the database
      ___(___$___)
    }
  )
)

# Create a smart microwave object
a_smart_microwave <- ___
  
# Call the get_cooking_time() method
___
Редагувати та запускати код