Julia JLD2:使用函数保存/加载结构

Julia JLD2:使用函数保存/加载结构,julia,Julia,是否可以使用JLD2保存/加载包含简单单行函数的结构 以下面的例子为例 保存结构的脚本: using JLD2 using Distributions struct test_struct test_array test_fun end a = rand(5) test_fun = () -> rand(Uniform(-5,5)) c = test_struct(a, test_fun) @save "jld2-test.jld2" c 和加载脚本: using

是否可以使用JLD2保存/加载包含简单单行函数的结构

以下面的例子为例

保存结构的脚本:

using JLD2
using Distributions

struct test_struct
    test_array
    test_fun
end

a = rand(5)
test_fun = () -> rand(Uniform(-5,5))

c = test_struct(a, test_fun)
@save "jld2-test.jld2" c
和加载脚本:

using JLD2
using Distributions

struct test_struct
    test_array
    test_fun
end

@load "jld2-test.jld2" c
c.test_fun()
这将导致错误。只有在加载脚本中也定义了
test\u fun
,它才能工作。是否有某种方法可以缓解这种情况,并真正保存包含函数的结构?或者他们是可以解决这个问题的替代方案


感谢您的帮助

除了从字面意义上说这是一个有趣的问题之外,它听起来像是一个糟糕的设计。为什么在(可能是单独的)脚本中定义函数并将它们加载到您的工作区是个问题?我能想到的唯一一种情况是,如果您试图保存闭包或动态生成的函数,您可能希望在结构中保存这样的东西。即使这样,我也会建议您不要使用它,使用结构成员变量而不是封闭变量,使用适当的动态分派方法,而不是“对象分派”方法。我的应用程序实际上与这个最小的示例非常接近。我正在做一些蒙特卡罗实验,我希望能够保存重新生成样本的函数。出于某些目的,保存分发对象就足够了,但有些更为复杂,我想做一些非常一般的事情。我想我可以为此编写一个单独的结构,但这肯定比保存/加载一个相对简单的函数要复杂一些。例如,differentialsequations.jl的函数也是结构的一部分,用于集成/蒙特卡罗问题(据我所见)。不过,我不太确定使用JLD2保存/加载这些文件的效果如何。我还没有测试它。我同意它看起来确实像是JLD2的一个限制(/bug?)。例如,使用
Serialization.serialize
,然后使用
Serialization.deserialize
,可以按预期工作。(但不幸的是,
Serialization
倾向于在不同版本的Julia之间的兼容性方面提供各种警告和警告)是的,谢谢。这可能行得通,但我认为序列化并不像您已经说过的那样是最佳的。特别是,因为我打算稍后发布代码供其他人使用,这对我来说似乎也有点容易出错。我想可能有一个我不知道的“简单”解决方案,我最近才开始使用Julia。除了从字面意义上说这是一个有趣的问题之外,它听起来像是一个糟糕的设计。为什么在(可能是单独的)脚本中定义函数并将它们加载到您的工作区是个问题?我能想到的唯一一种情况是,如果您试图保存闭包或动态生成的函数,您可能希望在结构中保存这样的东西。即使这样,我也会建议您不要使用它,使用结构成员变量而不是封闭变量,使用适当的动态分派方法,而不是“对象分派”方法。我的应用程序实际上与这个最小的示例非常接近。我正在做一些蒙特卡罗实验,我希望能够保存重新生成样本的函数。出于某些目的,保存分发对象就足够了,但有些更为复杂,我想做一些非常一般的事情。我想我可以为此编写一个单独的结构,但这肯定比保存/加载一个相对简单的函数要复杂一些。例如,differentialsequations.jl的函数也是结构的一部分,用于集成/蒙特卡罗问题(据我所见)。不过,我不太确定使用JLD2保存/加载这些文件的效果如何。我还没有测试它。我同意它看起来确实像是JLD2的一个限制(/bug?)。例如,使用
Serialization.serialize
,然后使用
Serialization.deserialize
,可以按预期工作。(但不幸的是,
Serialization
倾向于在不同版本的Julia之间的兼容性方面提供各种警告和警告)是的,谢谢。这可能行得通,但我认为序列化并不像您已经说过的那样是最佳的。特别是,因为我打算稍后发布代码供其他人使用,这对我来说似乎也有点容易出错。我认为可能有一个“简单”的解决方案,我只是不知道,我只是最近才开始使用朱莉娅。