gpt4 book ai didi

r - R引用类中有析构函数吗?

转载 作者:行者123 更新时间:2023-12-03 23:26:01 25 4
gpt4 key购买 nike

就像一个测试:

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 函数......

最佳答案

当您调用 rm您只需从环境中删除对象引用,但不会破坏元素。
这是垃圾收集器的工作,旨在在对象不再有引用时自动销毁对象(如本例中)。无论如何,垃圾收集器是由一些特殊事件触发的(例如,使用的内存过多等),因此当您调用 rm 时不会自动调用它。 (稍后可能会调用它)。

无论如何,您可以通过调用 gc() 来强制垃圾收集器,即使通常不鼓励这样做。 .

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

# > I am finalizing this thing...

通过运行上面的代码可以看到,你的 finalize 方法确实是在 gc() 之后调用的。

关于r - R引用类中有析构函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25288646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com