2016-09-04 2 views
6

Мне было интересно, есть ли способ использовать Символы для множественной отправки, а также включить «метод catch-all». то есть что-то вродеОбщая отправка с символами

function dispatchtest{alg<:Symbol}(T::Type{Val{alg}}) 
    println("This is the generic dispatch. The algorithm is $alg") 
end 
function dispatchtest(T::Type{Val{:Euler}}) 
    println("This is for the Euler algorithm!") 
end 

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

ответ

7

Вы можете сделать это следующим образом:

julia> function dispatchtest{alg}(::Type{Val{alg}}) 
      println("This is the generic dispatch. The algorithm is $alg") 
     end 
dispatchtest (generic function with 1 method) 

julia> dispatchtest(alg::Symbol) = dispatchtest(Val{alg}) 
dispatchtest (generic function with 2 methods) 

julia> function dispatchtest(::Type{Val{:Euler}}) 
      println("This is for the Euler algorithm!") 
     end 
dispatchtest (generic function with 3 methods) 

julia> dispatchtest(:Foo) 
This is the generic dispatch. The algorithm is Foo 

julia> dispatchtest(:Euler) 
This is for the Euler algorithm! 
+1

Обратите внимание, что производительность этого, вероятно, будет хуже, чем просто Условный еще о том, что проверяет для конкретных значений символов, а также медленнее, чем поиск символов в словаре, поэтому для этого нет эффективного варианта использования. Если вам не нужна расширяемость, используйте if-else; если вам нужна расширяемость, используйте dict. – StefanKarpinski

+0

Не могли бы вы предоставить нам хороший вариант использования для типов значений? Крису нужна расширяемость. Вы хотите использовать глобальный Dict? Это может быть проблемой с прекомпиляцией, если я правильно понимаю. – SalchiPapa

+1

Как это влияет на производительность, действительно зависит от того, насколько дорого стоит эта функция. В моем случае функции очень дорогостоящие, и будет ли это заявление if-else тысячами, если не десятками тысяч раз, где еще цена отправки будет выплачена один раз (и она незначительна, измеряется, вероятно, в микросекундах по сравнению с протоколом/часов фактического вызова функции). В этом случае я нашел это решение, действительно помогая производительности. Как всегда, ориентир для вашего конкретного случая. –