Обычно я определяю struct
с помощью Base.@kwdef
, а затем определяю внешний конструктор, например
Base.@kwdef struct A
a
b
end
Base.convert( ::Type{NamedTuple}, a::A ) = NamedTuple{propertynames(a)}(a)
function A( a::A; kwargs... )
nt = convert(NamedTuple, a)
nt = merge( nt, kwargs.data )
return A(;nt...)
end
, а затем вы можете сделать
var = A(1, 2)
var2 = A(var, b = 4)
, вы также можете определитьsetindex!
чтобы получить синтаксис, который вы имели в OP, но это позволило бы вам изменять только одно поле за раз.