Julia中获取容器类型而非元素类型的惯用方法
解决Julia中
container_type通用实现的问题 最优方案:单方法覆盖所有AbstractVector子类型
无需硬编码或遍历子类型,通过类型参数匹配所有AbstractVector的带参类型,直接提取其容器类型:
container_type(::Type{AV}) where {AV <: AbstractVector} = AV.name.wrapper
测试验证:
julia> container_type(Vector{Int}) Vector julia> container_type(BitVector) # BitVector是BitArray{1}的别名 BitArray julia> container_type(Base.ReshapedArray{Float64, 1, Vector{Float64}, Tuple{}}) Base.ReshapedArray
原写法报错原因
你尝试的container_type(::Type{V{T}}) where {V <: AbstractVector, T} 不符合Julia类型参数语法:类型变量不能嵌套在V{T}这种类型构造器中声明,Julia要求类型参数必须是顶层约束,不能用嵌套形式定义。
遍历子类型方法的修正
如果坚持用遍历子类型的方式,不要用nameof丢弃模块路径,直接将类型本身传入@eval:
for vec_type in subtypes(AbstractVector) try @eval container_type(::Type{<:$vec_type{T}}) where T = $vec_type catch exc showerror(stderr, exc) end end
但这种方法存在明显不足:
subtypes(AbstractVector)仅返回当前已加载的子类型,后续动态导入的自定义向量类型无法被覆盖- 会出现重复定义(如
AbstractRange在Base和Core.Compiler下有不同实现),维护成本高
因此更推荐第一种通用方案,一次定义即可适配所有AbstractVector子类型,包括未来新增的类型。
内容的提问来源于stack exchange,提问作者loonatick
相关产品推荐
相关产品推荐

