我正在尝试拆分功能
function my_fun(A::MyStruct)
if typeof(A.X) <: Nothing
println("Case 1");
else
println("Case 2");
end
end
根据A.X
的类型分为两种方法,其中
mutable struct MyStruct
t::Int64
X::Union{Float64, Nothing}
end
最有效的方法是什么?
答案 0 :(得分:4)
编译器只知道类型,不知道值,因此它无法区分“情况1”和“情况2”之间的区别。您既可以使用动态分配,也可以使用(例如)函数屏障,也可以通过将结构参数化来决定告诉编译器在两种情况下的区别。
我建议将您的代码更改为此:
struct MyStruct{T}
t::Int64
X::T
end
(我将结构更改为不可变的,因为对于这样的简单结构,几乎总是应该使用不可变的。)
然后
my_fun(A::MyStruct{Nothing}) = println("Case 1")
my_fun(A::MyStruct{Float64}) = println("Case 2")
如果您不能执行此操作,并且绝对需要具有类型联合,则可以改用功能屏障
_my_fun(::Type{Nothing}, A::MyStruct) = println("Case 1")
_my_fun(::Type{Float64}, A::MyStruct) = println("Case 2")
my_fun(A::MyStruct) = _my_fun(typeof(A.X), A)
通常,我希望第一个解决方案。