Julia:可变结构项的多分派

Julia:可变结构项的多分派,julia,Julia,我正在尝试拆分函数 function my_fun(A::MyStruct) if typeof(A.X) <: Nothing println("Case 1"); else println("Case 2"); end end 最有效的方法是什么?编译器只知道类型,不知道值,因此无法区分“案例1”和“案例2”。您可以使用动态分派,例如使用函数屏障,也可以决定通过使结构参数化来告诉编译器案例之间的差异 我建议将您的代码更改为: s

我正在尝试拆分函数

function my_fun(A::MyStruct)
    if typeof(A.X) <: Nothing
        println("Case 1");
    else
        println("Case 2");
    end
end

最有效的方法是什么?

编译器只知道类型,不知道值,因此无法区分“案例1”和“案例2”。您可以使用动态分派,例如使用函数屏障,也可以决定通过使结构参数化来告诉编译器案例之间的差异

我建议将您的代码更改为:

struct MyStruct{T}
     t::Int64
     X::T
end
(我将结构更改为不可变,因为对于像这样的简单结构,您几乎总是更喜欢不可变的)

那么

我认为你不能这样做,而且绝对需要一个类型联合,你可以使用一个函数屏障

_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)

通常,我更喜欢第一种解决方案。

编译器只知道类型,而不知道值,因此无法区分“案例1”和“案例2”。您可以使用动态分派,例如使用函数屏障,也可以决定通过使结构参数化来告诉编译器案例之间的差异

我建议将您的代码更改为:

struct MyStruct{T}
     t::Int64
     X::T
end
(我将结构更改为不可变,因为对于像这样的简单结构,您几乎总是更喜欢不可变的)

那么

我认为你不能这样做,而且绝对需要一个类型联合,你可以使用一个函数屏障

_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)

通常,我更喜欢第一种解决方案。

谢谢,这就是我要找的。谢谢,这就是我要找的。