2016-11-26 11 views
1

私はエリキシルとOTPに新しいです。OTPのモジュールを自分のミックスプロジェクトに含めるにはどうすればいいですか?

私のサーバーにはGenServer.Behaviourを使用しますが、いくつかの理由でエリクサーはそれを見つけることができません。私はミックスプロジェクトを作成しましたが、私はmix compileを入力すると、私は次のエラーを取得する

==ファイルのlib/lecture3.ex == **(CompileError)のコンパイル・エラーのlib/lecture3.ex:2:モジュールGenServer.Behaviourがロードされていないと (エリクサー)マクロを展開見つかりませんでした:Kernel.use/1 のlib/lecture3.ex:2:キャッシュ(モジュール)

を私は含める必要が推測しますモジュール、どのように?

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) 

答えて

4

実はGenServerbehavourあるので、単にuse GenServerを試してみてください。 ElixirのGenServerはErlangのgen_serverのラッパーで、未定義関数のデフォルトを提供します(Erlangでは常に6つの関数を定義し、Elixirではそうではありません)。

Erlangのモジュールであるgen_serverを明示的に使用する必要はありませんが、GenServerを使用してください。 thisを確認してください。

+0

ありがとうございました。私はあなたの答えを後で受け入れます –

関連する問題