Module Elixir重命名并包装Erlang模块?
是否可以重命名现有的Erlang模块?我想在Elixir项目(断言库)中使用几个Erlang模块中的一些代码 我不想把所有的Erlang模块都转换成Elixir,因为它们是完整的,但我想重命名它们,并可能为它们添加额外的函数。这两个模块都只是函数的集合,它们不实现行为或执行任何异常操作 我希望能够使用现有的Erlang模块:Module Elixir重命名并包装Erlang模块?,module,erlang,elixir,Module,Erlang,Elixir,是否可以重命名现有的Erlang模块?我想在Elixir项目(断言库)中使用几个Erlang模块中的一些代码 我不想把所有的Erlang模块都转换成Elixir,因为它们是完整的,但我想重命名它们,并可能为它们添加额外的函数。这两个模块都只是函数的集合,它们不实现行为或执行任何异常操作 我希望能够使用现有的Erlang模块: -module(foo_erl). -export([some_fun/1]). some_fun(Arg) -> ok. 并编写一个Elixir模块来扩展
-module(foo_erl).
-export([some_fun/1]).
some_fun(Arg) ->
ok.
并编写一个Elixir模块来扩展Erlang模块:
defmodule ExFoo do
somehow_extends_erlang_module :foo_erl
another_fun(arg) do
:ok
end
end
然后能够使用Erlang模块中定义的函数:
-module(foo_erl).
-export([some_fun/1]).
some_fun(Arg) ->
ok.
iex(1)>ExFoo.some_乐趣(:arg)=>:ok
这在长生不老药中可能吗?如果是这样的话,我该怎么做呢?这里是我可以建议的第一件事。我百分之百确信它能以更优雅的方式解决。因为我还不是长生不老药的大师,所以我稍后会回到这个话题上
defmodule Wrapper do
defmacro __using__(module) do
exports = module.module_info[:exports] -- [module_info: 0, module_info: 1]
for {func_name, arity} <- exports do
args = make_args(arity)
quote do
def unquote(func_name)(unquote_splicing(args)) do
unquote(module).unquote(func_name)(unquote_splicing(args))
end
end
end
end
defp make_args(0), do: []
defp make_args(arity) do
Enum.map 1..arity, &(Macro.var :"arg#{&1}", __MODULE__)
end
end
defmodule WrapperTest do
use ExUnit.Case, async: true
use Wrapper, :lists
test "max function works properly" do
assert (max [1, 2]) == 2
end
end
defmodule-Wrapper-do
使用(模块)do定义宏
导出=模块。模块信息[:导出]-[模块信息:0,模块信息:1]
对于{func_name,arity}通常,我们建议避免包装Erlang模块。如果您想以自动方式包装许多模块,velimir的帖子就在这里
但是,如果您有一次性的情况,您肯定希望包装一个Erlang模块,我建议您只需使用defdelegate
:
defmodule MyLists do
defdelegate [flatten(list), map(fun, list)], to: :lists
end
我有3个模块,我也需要这样做,但我选择使用defdelegate,因为它使包装显式。当有人打开MyLists
模块时,他们将确切知道扁平化/1的定义位置。