4

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

struct Foo
    foo::String
end

k = Foo("bar")

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

虽然我希望它打印“最终确定!”,但实际上我收到以下错误:

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

我可以找到关于终结器函数的文档很少,也没有示例,我做错了什么?

4

1 回答 1

5

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

特别是在base.jlfinalizer文件中的定义中,您可以看到有一个检查:

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!
于 2018-07-10T16:09:51.913 回答