就像测试一样:
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...")
}
)
然后尝试创建和删除对象:
u = myclass(15, 6)
u$print()
rm(u)
完全没有调用finalize函数......
答案 0 :(得分:5)
当您致电rm
时,您只需从环境中删除对象引用,但不要销毁该元素。
这是垃圾收集器的工作,它被设计为在具有nomore引用时自动销毁对象(如本例所示)。无论如何,垃圾收集器是由一些特殊事件触发的(例如,使用了太多的内存等),所以当你调用rm
时它不会被自动调用(稍后可能会调用它)。
无论如何,你可以通过拨打gc()
强制垃圾收集器,即使这通常是不鼓励的。
u = myclass(15, 6)
rm(u)
gc()
# > I am finalizing this thing...
正如您通过运行上述代码所看到的,您的finalize方法确实在gc()
之后调用