如何解决如何将命名元组字段提升为变量和关联值?
我有一个带有许多参数的模型,我将它们作为命名元组传递给它们。有没有一种方法可以将值提升到函数的变量范围内?
parameters = (
τ₁ = 0.035,β₁ = 0.00509,θ = 1,τ₂ = 0.01,β₂ = 0.02685,...
)
然后像现在这样使用:
function model(init,params) # params would be the parameters above
foo = params.β₁ ^ params.θ
end
有没有办法(marco?)直接将参数放入我的变量范围,这样我就可以做到这一点:
function model(init,params) # params would be the parameters above
@promote params # hypothetical macro to bring each named tuple field into scope
foo = β₁ ^ θ
end
后者带有大量数学代码,看起来更好。
解决方法
您可以使用UnPack.jl
包中的@unpack
1 :
julia> nt = (a = 1,b = 2,c = 3);
julia> @unpack a,c = nt; # selectively unpack a and c
julia> a
1
julia> c
3
1 以前是Parameters.jl
程序包的一部分,该程序包仍会导出@unpack
并具有您可能会发现有用的其他类似功能。
编辑:如注释中所述,由于字段名是运行时信息,因此无法编写通用宏@unpack x
。但是,您可以定义一个特定于您自己的类型/名称元组的宏,以将其解包
julia> macro myunpack(x)
return esc(quote
a = $(x).a
b = $(x).b
c = $(x).c
nothing
end)
end;
julia> nt = (a = 1,c = 3);
julia> @myunpack nt
julia> a,b,c
(1,2,3)
但是,我认为使用@unpack
更清楚,因为此版本“隐藏”了赋值,并且不清楚变量a
,b
和{{1}在哪里}来自阅读代码时。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。