開始使用免費開始

這就是終點(R6 物件的生命週期)

就像 R6 類別可以定義公開的 initialize() 方法,讓物件建立時執行自訂程式碼一樣,它們也可以定義公開的 finalize() 方法,讓物件被銷毀時執行自訂程式碼。finalize() 不應該有任何引數。它通常用來關閉與〔資料庫〕(https://www.rdocumentation.org/packages/DBI/topics/dbConnect)或〔檔案〕(https://www.rdocumentation.org/packages/base/topics/connections)的連線,或是回復副作用,例如還原被變更的全域 options()(〔文件〕(https://www.rdocumentation.org/packages/base/topics/options))或圖形 par()(〔文件〕(https://www.rdocumentation.org/packages/graphics/topics/par))參數。

程式碼範本如下:

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

當物件被 R 的自動垃圾回收器從記憶體中移除時,會呼叫 finalize() 方法。你可以輸入 gc()(〔文件〕(https://www.rdocumentation.org/packages/base/topics/gc))來強制進行垃圾回收。

本練習屬於課程

在 R 中使用 S3 與 R6 的物件導向程式設計

檢視課程

動手互動練習

試著完成這個範例程式碼,體驗一下這個練習。

# 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
___
編輯並執行程式碼