Erlang 如何将OTP中的模块包含到我的mix项目中?
我不熟悉长生不老药和OTP 我想为我的服务器使用Erlang 如何将OTP中的模块包含到我的mix项目中?,erlang,elixir,otp,Erlang,Elixir,Otp,我不熟悉长生不老药和OTP 我想为我的服务器使用GenServer.behavior,但由于某些原因elixir找不到它。我已经创建了一个混合项目,但是当我键入mixcompile时,我得到了以下错误 ==文件lib/讲师3.ex上的编译错误== **(CompileError)lib/讲师3.ex:2:module GenServer.Behavior未加载且找不到 (elixir)扩展宏:Kernel.use/1 lib/讲师3.ex:2:缓存(模块) 我想我必须包括这个模块,但是怎么做呢
GenServer.behavior
,但由于某些原因elixir找不到它。我已经创建了一个混合项目,但是当我键入mixcompile
时,我得到了以下错误
==文件lib/讲师3.ex上的编译错误==
**(CompileError)lib/讲师3.ex:2:module GenServer.Behavior未加载且找不到
(elixir)扩展宏:Kernel.use/1
lib/讲师3.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
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)
讲师3.ex:
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
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
,所以只需尝试使用GenServer
。Elixir中的GenServer是Erlang中gen_server
的包装器,它为未定义的函数提供了默认值(因此在Erlang中必须始终定义6个函数,而在Elixir中则不能)
您不必显式地使用Erlang模块
gen_server
,而是使用GenServer
。签出。实际上GenServer
是行为
,所以请尝试简单地使用GenServer
。Elixir中的GenServer是Erlang中gen_server
的包装器,它为未定义的函数提供了默认值(因此在Erlang中必须始终定义6个函数,而在Elixir中则不能)
您不必显式地使用Erlang模块
gen_server
,而是使用GenServer
。退房。谢谢你的帮助。我会接受你的回答,谢谢你的帮助。我稍后会接受你的回答