Julia 朱莉娅:匹配属于联合的任何类型

Julia 朱莉娅:匹配属于联合的任何类型,julia,Julia,我有一个联合{Type1,Type2,Type3},它匹配所有类型为这些类型之一的值。但是我如何匹配类型本身呢 MyU = Union{Float64, Int, Array} a::MyU = 3.5 # works a = 5 # works a = [1, 2, 3] # works # but of course a = Float64 # nope a = Int # nope a = Array # nope 对于普通类型,这通常通过Type{MyType}实现,其唯一值是MyTy

我有一个
联合{Type1,Type2,Type3}
,它匹配所有类型为这些类型之一的值。但是我如何匹配类型本身呢

MyU = Union{Float64, Int, Array}
a::MyU = 3.5 # works
a = 5 # works
a = [1, 2, 3] # works
# but of course
a = Float64 # nope
a = Int # nope
a = Array # nope
对于普通类型,这通常通过
Type{MyType}
实现,其唯一值是
MyType
。但是
Type{MyU}
只匹配
MyU
,而不匹配它包含的类型。我如何匹配这些

我当然可以只使用
数据类型
,但这有两个问题:

  • 它匹配任何类型,而不仅仅是我想要的类型
  • 它不匹配所有类型,例如
    Array
  • 我目前的解决方法是
    Union{DataType,UnionAll}
    ,但如果我在
    MyU
    中包含另一个
    Union
    或其他一些非具体类型,那么这是一个难看的黑客行为,而且肯定会崩溃和烧毁

    我的另一个解决方案是创建第二个并行联合,如下所示:

    MyU = Union{Float64, Int, Array}
    MyUT = Union{Type{Float64}, Type{Int}, Type{Array}}
    

    它确实工作,而且更严格,但它也很丑陋,并且由于人为地保持这些错误而引入了很大的人为错误的可能性。

    < P>你可以考虑这样的事情来避免宏(这可能是棘手的):

    然后:

    julia> MyU = Union{Float64, Int, Array}
    Union{Float64, Int64, Array}
    
    julia> MyUT = typewrap(MyU)
    Union{Type{Array}, Type{Float64}, Type{Int64}}
    
    编辑

    作为补充说明,您可以将
    gettypes
    定义为一个类似以下内容的行程序:

    gettypes(u) = u isa Union ? [u.a; gettypes(u.b)] : [u]
    
    编辑2

    或者更简单,没有中间数组:

    typewrap(u) = u isa Union ? Union{Type{u.a}, typewrap(u.b)} : Type{u}
    
    我认为你们的“平行联盟”才是出路。例如,通过使用宏从
    MyU
    自动构造
    MyUT
    ,可以避免保持它们同步的问题。
    typewrap(u) = u isa Union ? Union{Type{u.a}, typewrap(u.b)} : Type{u}