我是否需要显式销毁 Tcl 中第二个 class 实例中的 1 class 实例

Do I need to explicity destory an instance of 1 class which is within an instance of a 2nd class in Tcl

假设我有 class1,由 oo::class create

创建
oo::class create class1 {
   method bar {} {
      class2 create bee
      bee method1
   }
}

现在,假设我有这段代码:

class1 create po
po bar
po destroy

我是否还要销毁 po 中的实例蜜蜂,或者我是否也应该明确销毁 po::bee?
谢谢。

bee 是在 class1 的实例的命名空间中创建的,当实例被销毁时,命名空间将被删除,bee 也会消失。

所以你不需要显式地销毁它,但是如果你处理其他命名空间中你想删除的实例,你可以将它设置为在析构函数中自动发生:

oo::define class1 destructor {bee destroy}

如果想要创建实例的方法在创建实例被销毁时被销毁,要么在另一个命名空间中为创建的实例命名,例如::bee,或者让方法 return 成为 class2 new 的结果,像 set cee [po bar] 一样调用它。新实例可以用作 $cee 方法参数...

文档: oo::define, oo::object

oo::classcreate 方法更喜欢根据当前命名空间解析它正在创建的对象的名称(即,如果它们不是绝对名称)。这意味着当您在另一个具有非限定名称的对象的方法中调用它时,它创建的对象将被放入另一个对象中。 (您可以通过检查 create 方法的结果来验证这一点,它是为普通 类 创建的对象的完全限定名称。)反过来,这意味着当外部对象被销毁时,当删除外部对象的实例命名空间并杀死其中的命令时,内部对象也会被销毁。

让我们用一些简单的东西来演示 类:

oo::class create Inner {
    destructor {
        puts "Hi from an Inner"
    }
}
oo::class create Outer {
    method makeAnInner {} {
        puts [Inner create in]
    }
    destructor {
        puts "Hi from an Outer"
    }
}
Outer create out
out makeAnInner
out destroy

打印类似(命名空间名称 变化)这样的内容:

::oo::Obj19::in
Hi from an Outer
Hi from an Inner

然而,更直接地调用内部对象的 destroy 方法通常更好,因为这样在析构函数中发生的任何错误都不会被丢弃。 (对于其他销毁方案,当前的内部 API 由于各种丑陋的原因无法安全地保留错误报告,特别是因为这也是一种删除路线,有时会在发生更广泛的删除时使用。)