朱莉娅:可变的结构项的多个调度

时间:2019-06-22 11:14:08

标签: julia

我正在尝试拆分功能

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

最有效的方法是什么?

1 个答案:

答案 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)

通常,我希望第一个解决方案。