R引用类中是否有析构函数?

qed*_*qed 3 r reference-class

就像一个测试:

myclass = setRefClass("myclass",
                       fields = list(
                           x = "numeric",
                           y = "numeric"
                       ))


myclass$methods(
    dfunc = function(i) {
        message("In dfunc, I save x and y...")
        obj = .self
        base::save(obj, file="/tmp/obj.rda")
    }
    )

myclass$methods(
    print = function() {
            if (.self$x > 10) {
                stop("x is too large!")
            }
    message(paste("x: ", .self$x))
    message(paste("y: ", .self$y))
    }
    )

myclass$methods(
    initialize = function(x=NULL, y=NULL, obj=NULL) {
        if(is.null(obj)) {
            .self$x = x
            .self$y = y
        }
        else {
            .self$x = obj$x
            .self$y = obj$y
        }
    }
)


myclass$methods(
finalize = function() {
    message("I am finalizing this thing...")
}
)
Run Code Online (Sandbox Code Playgroud)

然后尝试创建和删除对象:

u = myclass(15, 6)
u$print()
rm(u)
Run Code Online (Sandbox Code Playgroud)

完全没有调用finalize函数......

dig*_*All 5

当你打电话给rm你时,只需从环境中删除对象引用,但不要销毁该元素.
这是垃圾收集器的工作,它被设计为在具有nomore引用时自动销毁对象(如本例所示).无论如何,垃圾收集器是由一些特殊事件触发的(例如,使用过多的内存等),因此在调用时不会自动调用rm它(稍后可能会调用它).

无论如何,你可以通过调用强制垃圾收集器,即使这通常是不鼓励的gc().

u = myclass(15, 6)
rm(u)
gc()

# > I am finalizing this thing...
Run Code Online (Sandbox Code Playgroud)

正如您通过运行上面的代码所看到的那样,您的finalize方法确实在之后调用 gc()