Юлия: Многократная отправка для изменяемых элементов структуры - PullRequest
1 голос
/ 22 июня 2019

Я пытаюсь разделить функцию

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 Ответ

4 голосов
/ 22 июня 2019

Компилятор знает только о типах, а не о значениях, и поэтому он не может определить разницу между «Case 1» и «Case 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)

ОбычноЯ бы предпочел первое решение.

...