正如标题所述,我的问题是:
有没有办法确定Elixir中名称存在的模块?
环顾四周后,我来到了this thread in the Elixir forums,但这并不是我想要的。在这个帖子中他们提到Code.ensure_loaded/1
,但我认为这不是我需要的。
现在我正在通过以下方式解决问题:
def module_exists?(module_name) where is_atom(module_name) do
!is_nil(module_name.module_info)
rescue
e in UndefinedFunctionError -> false
end
但我不相信。
感谢任何帮助,谢谢!
答案 0 :(得分:14)
通常,我们只是检查以确保编译模块中的给定函数。
iex(9)> Code.ensure_compiled?(Enum)
true
iex(10)>
您还可以检查是否确定了特定功能
ex(10)> function_exported? Enum, :count, 1
true
iex(11)>
修改强>
@Russ Matney关于Code.ensure_compiled?/1
加载模块的一个好点。
这是一种应该没有任何副作用的方法:
defmodule Utils do
def module_compiled?(module) do
function_exported?(module, :__info__, 1)
end
end
iex> Utils.module_compiled?(String)
true
iex> Utils.module_compiled?(NoModule)
false
Elixir模块导出:__info__/1
,因此对其进行测试可提供通用解决方案。
答案 1 :(得分:0)
从OTP 20开始,您可以使用Erlang函数来确定是否存在模块。 :code.module_status(Name)
将返回一个原子,告诉您模块是否已加载,文档:https://erlang.org/doc/man/code.html#module_status-1