更新时间: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
函数仅对用户定义的类型和复合类型有效.它不适用于Module
或Function
.
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).