In julia, where struct argument names are coming from?

42 views Asked by At

I have a newbie question. What I understand that a struct will have fields and once pass them by order. Like :

julia> struct Foo
           bar
           baz
       end

julia> foo = Foo(1, 2)
Foo(1, 2)

In something like Makie, the main struct is Figure(). All the tutorials are showing customized arguments like backgroundcolor, resolution ...etc.

f = Figure(backgroundcolor = :tomato)

But in the docstring, there is no mentioning for these keywords.

Thank you in advance

1

There are 1 answers

1
kirklong On BEST ANSWER

I think this is a duplicate of: Pass arguments to @kwdef struct programmatically

But to answer your question, as shown there you can have keyword fields by placing the Base.@kwdef macro before struct, i.e.:

Base.@kwdef struct Foo
    bar = nothing
    baz = nothing
end

Then doing Foo(baz=3) returns Foo(nothing,3) etc.

To answer your question about what they do in Makie, here is their relevant bit of code for making Figures (from their GitHub source code):

function Figure(; kwargs...)

    kwargs_dict = Dict(kwargs)
    padding = pop!(kwargs_dict, :figure_padding, theme(:figure_padding))
    scene = Scene(; camera=campixel!, kwargs_dict...)
    padding = convert(Observable{Any}, padding)
    alignmode = lift(Outside ∘ to_rectsides, padding)

    layout = GridLayout(scene)

    on(alignmode) do al
        layout.alignmode[] = al
        GridLayoutBase.update!(layout)
    end
    notify(alignmode)

    f = Figure(
        scene,
        layout,
        [],
        Attributes(),
        Ref{Any}(nothing)
    )
    # set figure as layout parent so GridPositions can refer to the figure
    # if connected correctly
    layout.parent = f
    f
end

They create a dictionary based on the keyword arguments, then pass those manually to the Figure struct, which is defined as:

struct Figure
    scene::Scene
    layout::GridLayoutBase.GridLayout
    content::Vector
    attributes::Attributes
    current_axis::Ref{Any}

    function Figure(args...)
        f = new(args...)
        current_figure!(f)
        f
    end
end

So they use the Figure function to access the keyword arguments and then pass the appropriate keywords to the Figure struct.