Structure binding in Julia?

Is there anyway to destructure using variable names different from fields?

struct S
    x::Int
    y::Int
end
 
s = S(1, 2)
(; x, y) = s # ok
(; a, b) = s # error: Type S has no field a 

In C++ I can do the following

struct S {
    int x, y;
};

S s{1, 2};
auto [a, b] = s; 

To do this you would have to do a,b = s.a, s.b

3 Likes

You can define iteration for your type (if that makes sense):

struct S
    x::Int
    y::Int
end

function Base.iterate(s::S, i = 1)
    if i <= nfields(s)
        return (getfield(s, i), i + 1)
    else
        return nothing
    end
end
julia> for s in S(3,4)
           @show s
       end
s = 3
s = 4

julia> a, b = S(6, 1);

julia> a
6

julia> b
1
4 Likes

If you use your structure as a simple “data container” (not using it in dispatching etc.), then maybe a named tuple would fit you?

julia> s = (x=1, y=2)
(x = 1, y = 2)

julia> s[:x]
1

julia> s.x
1

julia> a, b = s
(x = 1, y = 2)

or just a tuple

julia> s = (1, 2)
(1, 2)

julia> s[1]
1

julia> a, b = s
(1, 2)
1 Like

Edit: Ignore my answer, because I missed the point of the question …

using UnPack

@unpack a, b = s
1 Like