首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Julia:结构和方法构造函数中的函数

Julia:结构和方法构造函数中的函数
EN

Stack Overflow用户
提问于 2021-04-16 18:54:32
回答 1查看 278关注 0票数 2

在结构构造函数中存储函数的正确方法是什么?并找回它吗?然后改变它的参数?

我在0.4到0.5版本中写了一些代码,不出所料,它们不再工作了。简而言之:我有一个名为struct-cum-method的模型,我在其中定义了参数和函数形式。和一个类似结构的解决方案,其中我解决了模型的实例。我的目的是针对不同的参数和函数形式对模型进行多次模拟。下面的代码是包中模块的一部分。我不知道如何处理Julia 1.6中的函数类型(类似于下面的代码)。

代码语言:javascript
复制
# Non-Parametric version of struct + outer method constructor
# Model parameters and functions
struct Model
    f::Function
    p::Float64
    n::Int64
end
function Model(; 
    f::Function = x -> x + p,
    p::Float64 = 2.0,
    n::Int64 = 4
    )
    Model(f, p, n)
end

这是Model()的输出

代码语言:javascript
复制
julia> m = Model()
Model(var"#2#4"(), 2.0, 4)

julia> Model(p = 1.0)
Model(var"#3#5"(), 1.0, 4)

julia> m.f
#2 (generic function with 1 method)

julia> m.p
2.0

julia> m.n
4

julia> Model(f = x -> x - p)
Model(var"#15#16"(), 2.0, 4)


julia> m.f(1.0)
ERROR: UndefVarError: p not defined
Stacktrace:
 [1] (::var"#2#4")(x::Float64)
   @ Main ./REPL[2]:2
 [2] top-level scope
   @ REPL[4]:1

如果您能给出代码出错的地方以及如何修复代码的建议,我将不胜感激。如果有推荐的话,我想要一个参数化结构。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-16 21:08:46

您需要使用Base.@kwdefParameters包中的@with_kw等效项(我更喜欢后者,因为它为控制台提供了更好的格式)

代码语言:javascript
复制
Base.@kwdef struct Model
    p::Float64 = 2.0
    n::Int64 = 4
    f::Function = x -> x + p
end

现在可以这样使用:

代码语言:javascript
复制
julia> Model(p=7).f(11)
18

对于解决方案,您应该将实际的解决方案结构与构造函数分开。因此,您将拥有一个function solve(m::Model) (如果m在进程中发生了变化,则为solve! ),它将生成一个Solution对象。

要创建Solution对象,请使用与上面相同的模式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67123916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档