Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法使用R6对象删除它';谁有自己的方法?_R_Oop_R6 - Fatal编程技术网

有没有办法使用R6对象删除它';谁有自己的方法?

有没有办法使用R6对象删除它';谁有自己的方法?,r,oop,r6,R,Oop,R6,以下面给出的基本R6类为例: library(R6) Demo = R6Class("Demo", public = list( initialize = function(){ message("demo object initialized!") }, delete = function(){

以下面给出的基本R6类为例:

library(R6)

Demo = R6Class("Demo",
           public = list(
             initialize = function(){
               message("demo object initialized!")
             },
             delete = function(){
               #should contain the logic to delete the object
               gc()
             },
             finalize = function(){
               message("demo object deleted!")
             } 
           ))

demoObj = Demo$new()
demoObj$delete()

delete函数内部的逻辑应该是什么?是否可以删除对象(self)?

我不知道有什么简单的方法可以让R中的对象以这种方式“自毁”。对象属于创建它的环境,有充分的理由将对象生命周期的控制权留给创建它的环境,而不是对象本身

这并不意味着没有办法做到这一点,但实际上,您必须允许对象在其父帧中查找自己的名称(使用一个仅在删除过程启动后才识别它的标志),然后在父帧中对该名称调用
rm
。像这样的reprex:

库(R6)
Demo=R6Class(“Demo”,
公共=列表(
初始化=函数(){
消息(“演示对象已初始化!”)
},
delete_flag=FALSE,
delete=函数(){
self$delete_标志[1]“演示”
这是为了确保只删除正确的对象,例如:

demoObj1=Demo$new()
#>演示对象已初始化!
demoObj2=Demo$new()
#>演示对象已初始化!
demoObj3=Demo$new()
#>演示对象已初始化!
demoObj2$delete()
#>删除演示对象!
ls()
#>[1]“演示”“演示对象J1”“演示对象J3”
您可以看到,只有
demoObj2
删除了自身


由(v0.3.0)于2020-08-08创建的

我不熟悉r,但熟悉其他OO语言(如Java、Ruby),gc在不再引用该对象时完成。换句话说,该对象不会删除自身。一旦不再使用它,它将被垃圾收集。谢谢,我理解gc的用法,但想知道是否有任何方法可以使用类似rm(obj)的东西删除对象本身。将delete_标志设置为私有是否有意义,因为它仅用于内部使用?@AkshitAchara是的,尽管您需要一个getter函数才能读取它。谢谢,此方法将从父环境中删除该对象。是否有方法查找该对象的所有引用并将其删除,即如果另一个R6对象包含t我们希望删除的对象,那么该对象也应该从那里删除。(如果
demos@Akshit no,没有简单的方法可以做到这一点,原因很简单,一个对象没有任何关于它的点和名称的信息。就像我说的,依赖对象自己的
delete
方法来试图摆脱它是一个很大的挑战。请相信我:不管你在尝试什么要做到这一点,有一个更好的方法。考虑一个不同的设计,如果你陷入困境,这里有很多人可以提供帮助。