2016-09-04 14 views
6

Zastanawiałem się, czy istnieje sposób na użycie symboli do wielokrotnej wysyłki, ale także "metodą catch-all". czyli cośGeneryczna wysyłka z symbolami

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 

Drugi działa i pasuje co jest w instrukcji, po prostu zastanawiasz się, jak można dostać pierwszy do pracy.

Odpowiedz

7

Można zrobić to w ten sposób:

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

Należy pamiętać, że wydajność może to być mniej dobre niż tylko o instrukcję if-else, który sprawdza konkretne wartości symboli, a także wolniejsze niż wyszukiwanie symboli w słowniku, więc nie ma na to żadnego pożytecznego przykładu. Jeśli nie potrzebujesz rozszerzalności, użyj if-else; jeśli potrzebujesz rozszerzalności, użyj dyktowania. – StefanKarpinski

+0

Czy możesz podać nam dobry przykład użycia dla typów wartości? Chris potrzebuje rozszerzalności. Czy zamiast tego używasz globalnego Dicta? To może być problem z prekompilacją, jeśli dobrze rozumiem. – SalchiPapa

+1

Jak to wpływa na wydajność, naprawdę zależy od tego, jak kosztowna jest ta funkcja. W moim przypadku, funkcje są bardzo kosztowne i czy w przypadku słowa "else" tysiące, jeśli nie dziesiątki tysięcy razy, gdzie indziej cena wysyłki jest płatna raz (i malejąca, mierzona prawdopodobnie w mikrosekundach w porównaniu do minut/godziny rzeczywistego wywołania funkcji). Znalazłem to rozwiązanie jako naprawdę pomocne w tym przypadku. Jak zawsze, wzorzec dla konkretnego przypadku. –

Powiązane problemy