【发布时间】:2022-01-25 20:06:05
【问题描述】:
我有一个行为和一个函数,它需要一个应该实现该行为的模块列表。我想检查传入的每个模块是否确实实现了该行为。我可以通过下面的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
这是最好的检查方法吗?我在文档或 Elixir 论坛或任何地方都找不到任何东西。
我应该检查一下吗? 还是应该让责任完全由调用者承担?行为是否更多是关于“我想确保实现所需的一切”而不是“我希望其他人都知道我实现了所需的一切”?
有没有办法在 typespecs 中使用行为作为类型?我的函数规范可以说 args 应该实现我的行为,还是应该只使用 module()/atom()?
【问题讨论】:
-
您为什么要检查它,因为它的开发人员工作是在特定模块中实现行为,它是否与用户输入有某种关系?如果它与用户输入无关,我认为你不应该检查。
-
主要是为了使错误更像是“这应该实现这种行为”而不是“这个函数是未定义的”,并在做任何其他事情之前检查它,但我倾向于只做假设一切顺利
标签: elixir