首页 > 解决方案 > 包装长生不老药模块

问题描述

例如,如果您有一个模块

defmodule Foo do
    # lots of "unknown" functions
end

如何为此创建包装模块Foo,例如:

defmodule Bar do
    # wrap all functions in Foo
end

但是在Bar我想公开所有函数中Foo,但另外我想在每个函数中添加一些代码,特别是我想要try/catch一个可以出现在任何Foo.Error异常中的特定错误......我想这样做而不添加函数对于 中的每个函数Foo,因为这将变得重复。

我可以用宏来做到这一点吗?

标签: elixir

解决方案


AFAIU 你想通过复制类之间的继承逻辑来执行某种面向对象的编程。但这不是您可能已经知道的任何函数式编程语言(如 Elixir)的哲学。

但是,如果这确实是您想要做的,我发现这个问题使用元编程并旨在做与您正在寻找的类似的事情。不过看起来很复杂。

编辑:在我们进一步交谈之后,我更好地理解了你的问题。如果你想在没有太多重复的情况下定义函数,那么元编程就是要走的路!这是一个简单的示例,说明如何通过元编程在模块中定义多个函数:

defmodule MyModule do
  Enum.each ~w(method1 method2), fn(method_name) ->
    def unquote(:"#{method_name}")(), do: unquote(method_name)
  end
end

我想在不为 Foo 中的每个函数添加函数的情况下执行此操作,因为那样会重复。

我想这就是我会做的,但你确定它会重复吗?

此外,您还可以使用Exceptional 库来帮助您编写更少的错误处理函数 :)


推荐阅读