开始使用免费开始使用

这是终点(R6 对象的生命周期结束)

就像 R6 类可以定义公共的 initialize() 方法,在创建对象时运行自定义代码一样,它也可以定义公共的 finalize() 方法,在对象被销毁时运行自定义代码。finalize() 不应接受任何参数。它通常用于关闭与数据库文件的连接,或撤销副作用,例如还原全局 options()文档)或图形参数 par()文档)。

代码模板如下所示。

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

当 R 的自动垃圾回收器将对象从内存中移除时,会调用 finalize() 方法。您可以通过输入 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
___
编辑并运行代码