2016-11-26 3 views
1

Ich bin neu in Elixier und OTP.Wie kann ich ein Modul von OTP in mein Mix-Projekt integrieren?

Ich möchte GenServer.Behaviour für meinen Server verwenden, aber aus einigen Gründen Elixier kann es nicht finden. Ich habe eine Mischung Projekt erstellt, aber wenn ich mix compile geben bekomme ich folgende Fehler

== Übersetzungsfehler auf Datei lib/lecture3.ex == ** (CompileError) lib/lecture3.ex: 2: Modul GenServer.Behaviour nicht geladen und konnte nicht (Elixier) Expandieren Makro zu finden: Kernel.use/1 lib/lecture3.ex: 2: Cache (Modul)

ich denke, ich habe die einschließen Modul, aber wie?

mix.exs:

defmodule LECTURE3.Mixfile do 
    use Mix.Project 

    def project do 
    [app: :lecture3, 
    version: "0.1.0", 
    elixir: "~> 1.3", 
    build_embedded: Mix.env == :prod, 
    start_permanent: Mix.env == :prod, 
    deps: deps()] 
    end 

    def application do 
    [applications: [:logger]] 
    end 

    defp deps do 
    [] 
    end 
end 

lecture3.ex:

defmodule Cache do 
use GenServer.Behaviour 
def handle_cast({:put, url, page}, {pages, size}) do 
    new_pages = Dict.put(pages, url, page) 
    new_size = size + byte_size(page) 
    {:noreply, {new_pages, new_size}} 
end 
def handle_call({:get, url}, _from, {pages, size}) do 
    {:reply, pages[url], {pages, size}} 
end 

def handle_call({:size}, _from, {pages, size}) do 
    {:reply, size, {pages, size}} 
end 
def start_link do 
    :gen_server.start_link({:local,:cache}, __MODULE__, {HashDict.new, 0}, []) 
end 
def put(url, page) do 
    :gen_server.cast(:cache, {:put, url, page}) 
end 
def get(url) do 
    :gen_server.call(:cache, {:get, url}) 
end 
def size do 
    :gen_server.call(:cache, {:size}) 
end 
end 

defmodule CacheSupervisor do 
def init(_args) do 
    workers = [worker(Cache, [])] 
    supervise(workers, strategy: :one_for_one) 
end 
def start_link(domain) do 
    :supervisor.start_link(__MODULE__, [domain]) 
end 
end 

Enum.map(["de","edu", "com" ,"it"], fn(x)-> CacheSupervisor.start_link(x) 
end) 

Antwort

4

Eigentlich GenServer ist behavour, so einfach use GenServer versuchen. GenServer in Elixir ist Wrapper für gen_server in Erlang und es bietet Voreinstellungen für undefinierte Funktionen (so in Erlang müssen Sie immer 6 Funktionen und in Elixir nicht definiert).

Sie müssen nicht explizit gen_server verwenden, das ist Erlangs Modul, aber verwenden Sie GenServer. Überprüfen Sie this aus.

+0

Danke, dass geholfen hat. Ich werde deine Antwort später akzeptieren –

Verwandte Themen