Це кінець (життєвого циклу об'єкта 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
___