如何将 OTP 中的模块包含到我的混合项目中?
How to include a module from OTP into my mix project?
我是 elixir 和 OTP 的新手。
我想为我的服务器使用 GenServer.Behaviour
,但由于某些原因 elixir 找不到它。我创建了一个混合项目,但是当我输入 mix compile
时,出现以下错误
== Compilation error on file lib/lecture3.ex ==
** (CompileError) lib/lecture3.ex:2: module GenServer.Behaviour is not loaded and could not be found
(elixir) expanding macro: Kernel.use/1
lib/lecture3.ex:2: Cache (module)
我想我必须包含该模块,但是如何呢?
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)
实际上 GenServer
是 behavour
,所以请简单地尝试 use GenServer
。 Elixir 中的 GenServer 是 Erlang 中 gen_server
的包装器,它为未定义的函数提供默认值(因此在 Erlang 中你必须始终定义 6 个函数,而在 Elixir 中则不需要)。
您不必显式使用 gen_server
,这是 Erlang 的模块,但请使用 GenServer
。检查 this。
我是 elixir 和 OTP 的新手。
我想为我的服务器使用 GenServer.Behaviour
,但由于某些原因 elixir 找不到它。我创建了一个混合项目,但是当我输入 mix compile
时,出现以下错误
== Compilation error on file lib/lecture3.ex == ** (CompileError) lib/lecture3.ex:2: module GenServer.Behaviour is not loaded and could not be found (elixir) expanding macro: Kernel.use/1 lib/lecture3.ex:2: Cache (module)
我想我必须包含该模块,但是如何呢?
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)
实际上 GenServer
是 behavour
,所以请简单地尝试 use GenServer
。 Elixir 中的 GenServer 是 Erlang 中 gen_server
的包装器,它为未定义的函数提供默认值(因此在 Erlang 中你必须始终定义 6 个函数,而在 Elixir 中则不需要)。
您不必显式使用 gen_server
,这是 Erlang 的模块,但请使用 GenServer
。检查 this。