2016-06-05 4 views
0

Могут ли функции Julia соответствовать определенному символу, а не только символу типа? Например:Могут ли функции Julia соответствовать определенному символу?

function test(x::Symbol(:ALPHA)) end 
function test(x::Symbol(:BETA)) end 

Выше было то, что я пытался выполнить, хотя синтаксис неверен.

+2

Возможно, «Вал» - это то, что вам нужно. – jverzani

+4

Или просто 'if' :) – StefanKarpinski

+2

Вы о шаблоне соответствия? Нет, он не реализуется в Julia, но вы можете посмотреть на это: https://github.com/toivoh/julia-pattern-dispatch и этот https://matchjl.readthedocs.io/en/latest/ –

ответ

4

Действительно ли вы хотите, чтобы дополнительная версия функции была скомпилирована для каждого символа? Дополнительная компиляция довольно дорогая, и компилятор должен будет вставить ветку в любом случае ... вы не получите никакой производительности, отправив на значение.

Вместо этого, вы, вероятно, следует писать код, как это:

function test(x::Symbol) 
    if x == :ALPHA 
     ... 
    elseif x == :BETA 
     ... 
    else 
     throw(ArgumentError("Expected :ALPHA or :BETA")) 
    end 
end 

или, если вам не нравится, как это выглядит, рассмотрите возможность использования по шаблону с Match.jl:

test(x::Symbol) = @match x begin 
    :ALPHA => ... 
    :BETA => ... 
    _  => throw(ArgumentError("Expected :ALPHA or :BETA")) 
end 

Если вам действительно нужно отправку, вы можете использовать тип для обертывания значения, например Val{:ALPHA}. Этот тип необходимо создать на сайте вызывающего абонента. В 99% ситуаций это плохая идея. Помните, что это не мешает ветке при вызове функции, и на самом деле делает ее медленнее, поскольку отправка более дорогая, чем ветка.

Смежные вопросы