Setindex用于命名元组

Chr*_*kas 3 namedtuple julia

我正在尝试setindex为命名元组写一个非变异,给定一个名称的值类型var,它创建一个新的命名元组x.var = y.我现在拥有的是:

function setindex(nt::T,x,v::Val{var}) where {T,var}
  if var ? fieldnames(T)
    return x
  else
    typeof(x)(s == var ? y : w for (s,w) in nt)
  end
end
Run Code Online (Sandbox Code Playgroud)

但我的主要问题是,我不确定迭代命名元组以获得(name,value)对的好方法.

张实唯*_*张实唯 7

这是@generated版本.生成的代码简单易用,类型稳定.

julia> @generated function setindex(x::NamedTuple,y,v::Val)
         k = first(v.parameters)
         k ? x.names ? :x : :( (x..., $k=y) )
       end

julia> @code_warntype setindex((a=2, b=3), 4, Val(:b))
Body::NamedTuple{(:a, :b),Tuple{Int64,Int64}}
2 1 ? %1 = (Base.getfield)(x, :a)::Int64                                                               ????   macro expansion
  ?   %2 = %new(NamedTuple{(:a, :b),Tuple{Int64,Int64}}, %1, y)::NamedTuple{(:a, :b),Tuple{Int64,Int64}}?????  merge
  ???      return %2                                                                                   ??    

julia> @code_warntype setindex((a=2, b=3), 4, Val(:c))
Body::NamedTuple{(:a, :b),Tuple{Int64,Int64}}
2 1 ?     return x
Run Code Online (Sandbox Code Playgroud)

  • `nt =(a = 2,b = 5); (nt ......,b = 4)`.哇,我从来没有新的工作.这使它变得更简单!太好了! (2认同)