如何创建Vector{Any}?简化任意类型数组创建及构造疑问
问题解答
一、创建可容纳不同类型NamedTuple的数组(避免冗余类型声明)
你遇到的问题是fill((; some=missing), 10)创建的数组元素类型被推断为NamedTuple{(:some,), Tuple{Missing}},因此无法存入some=1(其类型为NamedTuple{(:some,), Tuple{Int64}})。
有两种简洁的解决方式:
直接创建
Any类型数组并填充
先初始化一个Any类型的未初始化数组,再用fill!填充初始值:values = Vector{Any}(undef, 10) fill!(values, (; some=missing)) values[1] = (; some=1) # 现在可以正常赋值显式指定宽泛的NamedTuple类型
如果不想用Any,可以指定元素类型为支持Missing和任意值的NamedTuple,写法比你原来的更简洁:values = fill(NamedTuple{(:some,), Tuple{Union{Missing, Any}}}((some=missing,)), 10) values[1] = (; some=1)这里通过
Union{Missing, Any}让NamedTuple的some字段接受任意类型,同时保留缺失值支持。
二、关于Any类型数组的构造问题
Vector{Any}(undef, 10)可行是因为这是Julia内置的未初始化数组构造语法:Vector{T}(undef, n)用于创建长度为n、元素类型为T的未初始化数组。
而Vector{Any}((; some=missing), 10)失败的原因是Julia没有提供这种构造方法。如果要创建填充了指定值的Any类型数组,正确的写法是:
# 方法1:先初始化未初始化数组,再填充 values = Vector{Any}(undef, 10) fill!(values, (; some=missing)) # 方法2:将填充后的数组转换为Any类型 values = Vector{Any}(fill((; some=missing), 10))
内容的提问来源于stack exchange,提问作者Alex Craft
相关产品推荐
相关产品推荐

