Skip to content

Commit 49e2f41

Browse files
matbesanconJeffBezanson
authored andcommitted
add setindex for named tuples (#33468)
1 parent 5f013d8 commit 49e2f41

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

base/namedtuple.jl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,3 +300,27 @@ function structdiff(a::NamedTuple{an}, b::Union{NamedTuple{bn}, Type{NamedTuple{
300300
NamedTuple{names,types}(map(n->getfield(a, n), names))
301301
end
302302
end
303+
304+
"""
305+
setindex(nt::NamedTuple, val, key::Symbol)
306+
307+
Constructs a new `NamedTuple` with the key `key` set to `val`.
308+
If `key` is already in the keys of `nt`, `val` replaces the old value.
309+
310+
```jldoctest
311+
julia> nt = (a = 3,)
312+
(a = 3,)
313+
314+
julia> Base.setindex(nt, 33, :b)
315+
(a = 3, b = 33)
316+
317+
julia> Base.setindex(nt, 4, :a)
318+
(a = 4,)
319+
320+
julia> Base.setindex(nt, "a", :a)
321+
(a = "a",)
322+
```
323+
"""
324+
function setindex(nt::NamedTuple, v, idx::Symbol)
325+
merge(nt, (; idx => v))
326+
end

test/namedtuple.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,3 +267,11 @@ let n = NamedTuple{(:T,), Tuple{Type{Float64}}}((Float64,))
267267
@test n isa NamedTuple{(:T,), Tuple{Type{Float64}}}
268268
@test n.T === Float64
269269
end
270+
271+
# setindex
272+
let nt0 = NamedTuple(), nt1 = (a=33,), nt2 = (a=0, b=:v)
273+
@test Base.setindex(nt0, 33, :a) == nt1
274+
@test Base.setindex(Base.setindex(nt1, 0, :a), :v, :b) == nt2
275+
@test Base.setindex(nt1, "value", :a) == (a="value",)
276+
@test Base.setindex(nt1, "value", :a) isa NamedTuple{(:a,),<:Tuple{AbstractString}}
277+
end

0 commit comments

Comments
 (0)