在Elixir中,有没有办法确定模块是否存在?

时间:2017-05-09 23:22:21

标签: elixir

正如标题所述,我的问题是:

有没有办法确定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

但我不相信。

感谢任何帮助,谢谢!

2 个答案:

答案 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