gpt4 book ai didi

Julia:在函数内解包参数的最佳实践

转载 作者:行者123 更新时间:2023-12-04 17:43:51 31 4
gpt4 key购买 nike

我可以解包一个元组。我正在尝试编写一个函数(或宏),该函数(或宏)将从类型构造函数 Parameters() 的实例中解压其中的一个子集。 .也就是说,我知道该怎么做:

a,b,c = unpack(p::Parameters)
但我想做这样的事情:
b,c = unpack(p::Parameters, b,c)
或者甚至更懒惰:
unpack(p::Parameters, b, c)
这是为了避免编写以下内容:
function unpack_all_oldstyle(p::Parameters)
a=p.a; b=p.b; c=p.c; ... z=p.z;
return a,b,c,...,z
end
我的方法有问题,但希望有一个修复。
如果从我的问题的措辞中不清楚,我是一个完全无知的人。我在此处阅读了有关解压缩省略号的信息: how-to-pass-tuple-as-function-arguments
    "module UP tests Unpacking Parameters"
module UP

struct Parameters
a::Int64
b::Int64
c::Int64
end

"this method sets default parameters and returns a tuple of default values"
function Parameters(;
a::Int64 = 3,
b::Int64 = 11,
c::Int64 = 101
)
Parameters(a, b, c)
end

"this function unpacks all parameters"
function unpack_all(p::Parameters)
return p.a, p.b, p.c
end

"this function tests the unpacking function: in the body of the function one can now refer to a rather than p.a : worth the effort if you have dozens of parameters and complicated expressions to compute, e.g. type (-b+sqrt(b^2-4*a*c))/2/a instead of (-p.b+sqrt(p.b^2-4*p.a *p.c))/2/p.a"
function unpack_all_test(p::Parameters)
a, b, c = unpack_all(p)
return a, b, c
end

"""
This function is intended to unpack selected parameters. The first, unnamed argument is the constructor for all parameters. The second argument is a tuple of selected parameters.
"""
function unpack_selected(p::Parameters; x...)
return p.x
end

function unpack_selected_test(p::Parameters; x...)
x = unpack_selected(p, x)
return x
end

export Parameters, unpack_all, unpack_all_test, unpack_selected, unpack_selected_test

end

p = UP.Parameters() # make an instance
UP.unpack_all_test(p)
## (3,11,101) ## Test successful

UP.unpack_selected_test(p, 12)
## 12 ## intended outcome

UP.unpack_selected_test(p, b)
## 11 ## intended outcome

UP.unpack_selected_test(p, c, b, a)
## (101,11,3) ## intended outcome

最佳答案

已经存在一个:Parameters.jl .

julia> using Parameters

julia> struct Params
a::Int64
b::Int64
c::Int64
end

julia> @unpack a, c = Params(1,2,3)
Params(1,2,3)

julia> a,c
(1,3)

julia> @with_kw struct Params
a::Int64 = 3
b::Int64 = 11
c::Int64 = 101
end
julia> @unpack c,b,a = Params()
Params
a: Int64 3
b: Int64 11
c: Int64 101


julia> c,b,a
(101,11,3)
顺便说一句,您可以修复您的 unpack_selected经过: unpack_selected(p::Parameters, fields...) = map(x->getfield(p, x), fields) .
# note that, the selected field names should be Symbol here
julia> unpack_selected(p, :b)
(11,)

julia> unpack_selected(p, :c, :b, :a)
(101,11,3)

关于Julia:在函数内解包参数的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44298860/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com