在Julia中为对象设置终结函数

时间:2018-07-10 15:45:29

标签: julia

我正在调试一些Julia代码,并试图弄清为什么以下代码不起作用。 (朱莉娅0.6.3)

struct Foo
    foo::String
end

k = Foo("bar")

finalizer(k, k->print("finalized!"))

虽然我希望它能打印“ finalized!”,但实际上却出现以下错误:

ERROR: objects of type Foo cannot be finalized
Stacktrace:
 [1] finalizer(::Any, ::Any) at ./base.jl:127

我找不到关于 finalizer 函数的文档,也没有示例,我在做什么错了?

1 个答案:

答案 0 :(得分:5)

如果您查找finalizer帮助,您将了解对象的类型必须是可变结构。

尤其是在 base.jl 文件的finalizer定义中,您可以看到有一个检查:

if isimmutable(o)
    error("objects of type ", typeof(o), " cannot be finalized")
end

表示您不能为不可变的对象设置终结器。

在Julia 0.7中,finalizer的语法略有不同,但是行为相同,请参见https://github.com/JuliaLang/julia/blob/master/base/gcutils.jl#L15

这是一个具有可变结构的示例:

julia> mutable struct Foo
           foo::String
       end

julia> k = Foo("bar")
Foo("bar")

julia> finalizer(k, k->print("finalized!"))

julia> finalize(k)
finalized!