The goal of Accessors.jl is to make updating immutable data simple. It is the successor of Setfield.jl.
Say you have some immutable data structure, such as a NamedTuple
:
julia> nt = (a=1, b=2)
(a = 1, b = 2)
If you try something like nt.b=3
, it will throw an error. But
using Accessors, we can change it anyways:
julia> using Accessors
julia> @set nt.b=3
(a = 1, b = 3)
Note that this only returns an updated copy of nt
, and does not overwrite or mutate the
value bound to nt
:
julia> nt
(a = 1, b = 2)
To overwrite the old definition, we can rebind nt
to the new version:
julia> nt = @set nt.b=3
(a = 1, b = 3)
julia> nt
(a = 1, b = 3)
As this is a common use case, the convenience macro @reset
rebinds the variable (nt
) to the updated version:
julia> @reset nt.b=4
(a = 1, b = 4)
julia> nt
(a = 1, b = 4)
For more detail, see this tutorial and/or watch this video:
- AccessorsExtra.jl [docs] introduces additional optics and related functions, that are considered too experimental for inclusion in
Accessors
. For Julia 1.8 and older,AccessorsExtra
also provides integrations with other packages; for Julia 1.9+, these are mostly included inAccessors
itself.