2016-03-01 39 views
7

Mi chiedevo se è possibile trovare tutti i moduli che hanno implementazioni per determinati moduli?È possibile trovare tutti i moduli che implementano determinati protocolli?

Ho un semplice protocollo:

defprotocol Ep.PerformTest do 
    @doc "Should return tupple {out, time}" 
    def test(struct) 
end 

E alcuni moduli che hanno implementazioni di questo protocollo:

defmodule Ep.Test.Rexcpp do 
    defstruct [:input, :code, :output] 

    def displayName(), do: "Rextester C++" 

    defimpl Ep.PerformTest, for: Ep.Test.Rexcpp do 
    def test(struct) do 

    end 
    end 
end 

risposta

7

Protocol.extract_impls/2 sembra essere quello che stai cercando.

Estrae tutti i tipi implementati per il protocollo specificato dai percorsi specificati.

Grazie al commento di OP, ecco cosa il codice dovrebbe essere simile per l'esempio nella domanda:

path = :code.lib_dir(:protocol_test, :ebin) 
mods = Protocol.extract_impls(Ep.PerformTest, [path]) 

Dal momento che stiamo chiamando il modulo Erlang :code qui per ottenere il percorso, il nome del modulo esigenze per essere nel formato atomico che Erlang usa.

+0

Come secondo parametro dovrei passare: code.all_loaded()? – Haito

+0

Non penso sia così. In base ai documenti iex> percorso =: code.lib_dir (: elixir,: ebin), il percorso contiene il percorso alla posizione devix dell'elisir – Haito

+0

Provalo e verifica se funziona. Non so davvero quale dovrebbe essere il parametro dei percorsi. – CoderDennis

Problemi correlati