2016-03-01 3 views
7

Ich frage mich, ob es möglich ist, alle Module zu finden, die Implementierungen für bestimmte Module haben?Ist es möglich, alle Module zu finden, die ein bestimmtes Protokoll implementieren?

Ich habe ein einfaches Protokoll:

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

Und einige Module, die Implementierungen dieses Protokolls haben:

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 

Antwort

7

Protocol.extract_impls/2 scheint zu sein, was Sie suchen.

Extrahiert alle Typen, die für das angegebene Protokoll implementiert sind, aus den angegebenen Pfaden.

Dank OP Kommentar, hier ist es, was der Code für das Beispiel in der Frage aussehen soll:

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

Da wir den Aufruf den Erlang :code Modul den Weg zu bekommen, muss die Modulnamen im Atomformat zu sein, das Erlang benutzt.

+0

Als zweiter Parameter sollte ich übergeben: code.all_loaded()? – Haito

+0

Ich glaube nicht, dass das der Fall ist. Basierend auf der Dokumentation iex> path =: code.lib_dir (: elixir,: ebin), enthält der Pfad den Pfad zum Elixir devkit location – Haito

+0

Versuchen Sie das und sehen Sie, ob es funktioniert. Ich weiß nicht wirklich, was der paths-Parameter sein sollte. – CoderDennis

Verwandte Themen