elixir - 包装长生不老药模块
问题描述
例如,如果您有一个模块
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
,因为这将变得重复。
我可以用宏来做到这一点吗?
解决方案
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 库来帮助您编写更少的错误处理函数 :)
推荐阅读
- python - 将 sympy 布尔表达式转换为 sympy 整数
- django - 如何在不暂停应用程序执行的情况下在后台运行长时间任务 od django
- android - Android - MediaSession 不捕获关键事件,但在 logcat 中看到
- excel - 某些复选框的值被视为 FALSE,即使它是 TRUE
- flutter - 如何在颤动中改变凸起按钮边框底部的颜色?
- flutter - Flutter ReorderableListView - how to add divider
- java - 如何通过 Spring Boot / Tomcat 发送带有 GET 参数的 json?
- swift - Why is my local video file path within the document directory not working after some time? [Swift]
- c# - 为什么这不会将正确的数字投射到 playerNumber?
- java - java frame not changing colour