julia - Julia:匹配属于联合的任何类型
问题描述
我有一个Union{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
,而不匹配它包含的类型。我如何匹配这些?
我当然可以只使用DataType
,但这有两个问题:
- 它匹配任何类型,不仅是我想要的。
- 它与 UnionAll 类型不匹配,例如
Array
.
我目前的解决方法是Union{DataType,UnionAll}
,但如果我Union
在MyU
.
我的另一个解决方案是像这样创建第二个并行联合:
MyU = Union{Float64, Int, Array}
MyUT = Union{Type{Float64}, Type{Int}, Type{Array}}
它确实有效并且更严格,但它也很丑陋,并且在手动保持同步时引入了很大的人为错误的可能性。
解决方案
您可以考虑这样的事情来避免宏(这可能很棘手):
gettypes(u::Union) = [u.a; gettypes(u.b)]
gettypes(u) = [u]
typewrap(u) = Union{[Type{v} for v in gettypes(u)]...}
进而:
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}
推荐阅读
- javascript - 如何强制在浏览器而不是应用程序中打开外部链接?
- c# - 我想在 Xamarin 中制作增量游戏,并且我制作了一些计时器,这些计时器给了我一个异常错误
- google-apps-script - 基于动态和变化的源表创建静态概览表
- java - XSD 到 java bean
- mysql - 有没有更好的方法从 mysql 获取 ISO Ttimestamp?
- haskell - Haskell 实例包装 []
- android - 原因:org.gradle.api.internal.plugins.PluginApplicationException:无法应用插件 [id 'com.android.application']
- php - 如何使用 filepond 发送文件?
- c++ - 如何正确划分方阵?
- python - 一旦达到训练,Keras 就会保存最佳模型