1

我想知道是否有NotImplementedError我可以通过的标准Kernel.raise/1。我很好奇我是否可以弄清楚(不仅仅是尝试)该模块是否存在。

更一般地说,能够搜索甚至只是列出iex会话的所有“可用”模块似乎很有用。

这个问题与其他问题类似:

但是这个问题是在询问“[Elixir] 标准库模块”。我想检索或生成一个(Elixir)列表(即我可以进一步操作的 Elixir 值)加载到特定会话中或以其他方式“可用”的所有模块。iex

4

2 回答 2

4

回答提出的问题

我很好奇我是否可以弄清楚(不仅仅是尝试)该模块是否存在。

Code.ensure_loaded?/1哪一个确实做到了这一点。

Code.ensure_loaded?(Atom)
#⇒ true
于 2019-11-19T04:41:53.803 回答
0

我在 Elixir 论坛上找到了这篇文章:

一条注释指向IEx.AutocompleteElixir 源代码中模块中的一个函数:

以下是函数使用的函数,所有函数都位于同一文件的下方:

defp get_modules(true) do
    ["Elixir.Elixir"] ++ get_modules(false)
  end

  defp get_modules(false) do
    modules = Enum.map(:code.all_loaded(), &Atom.to_string(elem(&1, 0)))

    case :code.get_mode() do
      :interactive -> modules ++ get_modules_from_applications()
      _otherwise -> modules
    end
  end

  defp get_modules_from_applications do
    for [app] <- loaded_applications(),
        {:ok, modules} = :application.get_key(app, :modules),
        module <- modules do
      Atom.to_string(module)
    end
  end

  defp loaded_applications do
    # If we invoke :application.loaded_applications/0,
    # it can error if we don't call safe_fixtable before.
    # Since in both cases we are reaching over the
    # application controller internals, we choose to match
    # for performance.
    :ets.match(:ac_tab, {{:loaded, :"$1"}, :_})
  end

:code.all_loaded()似乎是我想要的:

返回{Module, Loaded}所有已加载模块的元组列表。Loaded通常是绝对文件名,如is_loaded/1.

于 2019-11-18T21:48:31.233 回答