2017-06-01 40 views
2

我可以解开一个元组。我试图编写一个函数(或宏),从类型构造函数Parameters()的实例中解压缩这些函数的子集。也就是说,我知道该怎么做:Julia:风格解压

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

workspace() 

    "module UP tests Unpacking Parameters" 
    module UP 

    "this type declaration initiates a constructor function" 
    type Parameters 
     a::Int64 
     b::Int64 
     c::Int64 
    end 

    "this function 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 

回答

6

已经存在一个:Parameters.jl

julia> using Parameters 

julia> type 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 type 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) 
+0

我想再次为您的编辑upvote:非常有用的解释如何解决我的伪代码!谢谢! – PatrickT