Kết thúc (vòng đời của một đối tượng R6)
Cũng giống như một lớp R6 có thể định nghĩa phương thức initialize() công khai để chạy mã tùy chỉnh khi đối tượng được tạo, lớp đó cũng có thể định nghĩa phương thức finalize() công khai để chạy mã tùy chỉnh khi đối tượng bị hủy. finalize() không nhận đối số nào. Phương thức này thường dùng để đóng kết nối tới cơ sở dữ liệu hoặc tệp, hoặc hoàn tác các tác dụng phụ như thay đổi options() toàn cục (tài liệu) hay các tham số đồ họa par() (tài liệu).
Mẫu mã như sau.
thing_factory <- R6Class(
"Thing",
public = list(
initialize = function(x, y, z) {
# do something
},
finalize = function() {
# undo something
}
)
)
Phương thức finalize() sẽ được gọi khi đối tượng bị loại bỏ khỏi bộ nhớ bởi bộ gom rác tự động của R. Bạn có thể ép gom rác bằng cách gõ gc() (tài liệu).
Bài tập này là một phần của khóa học
Lập trình hướng đối tượng với S3 và R6 trong R
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
# 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
___