gpt4 book ai didi

julia - 为命名元组设置索引

转载 作者:行者123 更新时间:2023-12-01 08:16:33 25 4
gpt4 key购买 nike

我正在尝试为命名元组编写一个非变异 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

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

最佳答案

这是 @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

关于julia - 为命名元组设置索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53149008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com