【问题标题】:How to include a module from OTP into my mix project?如何将 OTP 中的模块包含到我的混合项目中?
【发布时间】:2017-04-10 18:18:25
【问题描述】:

我不熟悉灵药和 OTP。

我想为我的服务器使用GenServer.Behaviour,但由于某些原因,elixir 找不到它。我创建了一个混合项目,但是当我输入 mix compile 时,我收到以下错误

== 文件 lib/lecture3.ex 上的编译错误 == ** (CompileError) lib/lecture3.ex:2: 模块 GenServer.Behaviour 未加载且找不到 (elixir) 扩展宏: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)

【问题讨论】:

    标签: erlang elixir erlang-otp


    【解决方案1】:

    其实GenServer就是behavour,所以试试use GenServer。 Elixir 中的 GenServer 是 Erlang 中 gen_server 的包装器,它为未定义的函数提供默认值(因此在 Erlang 中您必须始终定义 6 个函数,而在 Elixir 中则不需要)。

    您不必显式使用gen_server,这是Erlang 的模块,而是使用GenServer。签出this

    【讨论】:

    • 感谢您的帮助。我稍后会接受你的回答
    猜你喜欢
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多