我有一个行为和一个函数,它采用应该实现该行为的模块列表。我想检查传入的每个模块是否确实实现了该行为。我可以用MyBehaviour.implemented_by?/1
下面的方法做到这一点,但我想知道是否有更直接的方法。
defmodule MyBehaviour do
@callback do_something(String.t(), String.t()) :: no_return()
def implemented_by?(module) do
:attributes
|> module.module_info()
|> Enum.member?({:behaviour, [__MODULE__]})
end
end
Run Code Online (Sandbox Code Playgroud)
这是检查的最好方法吗?我在文档或 Elixir 论坛或任何地方都找不到任何内容。
我应该检查一下吗?或者我应该让责任完全落在来电者身上?行为是否更多是关于“我想确保我实现所有需要的东西”而不是“我希望其他人知道我实现了所有需要的东西”?
有没有办法在 typespecs 中使用行为作为类型?我的函数规范可以说 args 应该实现我的行为,还是应该只使用module()/atom()
?
elixir ×1