且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在Julia中编写模块finalize方法的正确方法是什么?

更新时间:2022-12-24 19:05:16

恕我直言,workspace没有任何障碍,并且finalizer仅在用户定义的类型和复合类型上有效.

IMHO, workspace takes no ***ers and in addition the finalizer works well only on user-defined and composite types.

我已经进行了一些测试.看看我的结果:

I've performed some tests. Have a look at my results:

julia> type Foo
         x
         Foo(x) = begin obj = new(x); finalizer(obj,(o) -> println("The end.")); return obj end
       end

julia> Foo(1)

julia> workspace()

julia> gc()
Module the end.error in running finalizer: ErrorException("task switch not allowed from inside gc finalizer")
The end.error in running finalizer: ErrorException("task switch not allowed from inside gc finalizer")

另一个对象定义在模块范围内的测试:

Another test with object defined inside module scope:

julia> module FinMod

        type T  
            x::Int  
        end

        finalizer(T(1), (t) -> println("Module the end."))
       end
FinMod

julia> FinMod
FinMod

julia> workspace()

julia> gc()
Module the end.error in running finalizer: ErrorException("task switch not allowed from inside gc finalizer")

函数(一流的对象)呢?

What about functions(first-class objects)?

julia> function foo()  println("I'm foo") end
foo (generic function with 1 method)

julia> finalizer(foo, (f) -> println("foo function is dead now."))

julia> foo
foo (generic function with 1 method)

julia> workspace()

julia> foo
ERROR: UndefVarError: foo not defined

julia> gc()

julia> #nothing happened

因此,总结一下:我认为workspace不会调用finalize. finalizer函数仅对用户定义的类型和复合类型有效.它不适用于ModuleFunction.

So, to summarize: In my opinion workspace doesn't call finalize. The finalizer function works OK only for user-defined and composite types. It does not work for Module or Function.

更新:我记得workspace将以前的Main模块重写为LastMain.因此,即使我们的模块不能从Main进入,也仍然可以在LastMain范围内使用(与我上面使用的功能相同).

Update: I remembered that workspace rewrites previous Main module into LastMain. So even if our module is not accesible from Main it's is still alive inside LastMain scope (the same works for the function which I used above).