我正在尝试拆分功能
function my_fun(A::MyStruct)
if typeof(A.X) <: Nothing
println("Case 1");
else
println("Case 2");
end
end
Run Code Online (Sandbox Code Playgroud)
根据 的类型分为两种方法A.X,其中
mutable struct MyStruct
t::Int64
X::Union{Float64, Nothing}
end
Run Code Online (Sandbox Code Playgroud)
最有效的方法是什么?
编译器只知道类型,而不知道值,因此它无法区分“案例 1”和“案例 2”之间的区别。您可以使用动态分派,并使用例如函数屏障,或者您可以决定通过使结构参数化来告诉编译器不同情况。
我建议将您的代码更改为:
struct MyStruct{T}
t::Int64
X::T
end
Run Code Online (Sandbox Code Playgroud)
(我将结构更改为不可变的,因为对于像这样的简单结构,您几乎总是更喜欢不可变的)。
然后,
my_fun(A::MyStruct{Nothing}) = println("Case 1")
my_fun(A::MyStruct{Float64}) = println("Case 2")
Run Code Online (Sandbox Code Playgroud)
我你不能这样做,绝对需要有一个类型联合,你可以改用函数屏障
_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)
Run Code Online (Sandbox Code Playgroud)
通常,我更喜欢第一个解决方案。