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}