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,AccessorsExtraalso provides integrations with other packages; for Julia 1.9+, these are mostly included inAccessorsitself.
