【问题标题】:How to retrieve all of the loaded modules in `iex`?如何检索 `iex` 中所有已加载的模块?
【发布时间】:2020-03-14 08:16:49
【问题描述】:

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

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

这个问题与另一个问题类似:

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

【问题讨论】:

  • 这能回答你的问题吗? Get a list of all elixir modules in IEx
  • @AdamMillerchip 是和否。您的回答确实导致模块在iex打印。因为我不确定我正在寻找的模块的“完整”名称,甚至它是否存在[它不存在],我真的想搜索模块列表,而不是只需打印它们。这个问题似乎是关于列出“标准库模块”——这个问题是关于列出所有加载的模块或从特定的iex 会话中可用的其他模块。

标签: elixir elixir-iex


【解决方案1】:

回答上述问题

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

Code.ensure_loaded?/1exatly 做到了这一点。

Code.ensure_loaded?(Atom)
#⇒ true

【讨论】:

  • 我认为这不会有太大帮助,因为我不确定模块的完整 名称,即它是Elixir.NotImplementedError 还是其他名称。
  • 是的,我知道没有“完整”或“短”名称——名称 Elixir 中的全名。但这就是为什么这个答案对我没有帮助。
【解决方案2】:

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

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

下面是函数使用的函数,都在同一个文件的下面:

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 所述。

【讨论】:

  • 请注意 :ac_tab 是内部实现,没有人承诺它会与未来的版本/发行版兼容。
  • @AlekseiMatiushkin 好点!我想只使用:code.all_loaded() 本身通常就足够了。否则,我想跟踪 Elixir 源代码中的 iex 代码会为任何需要检查已加载应用程序中的模块的人指明正确的方向。
  • 如果您在从核心查找现有模块后,请转到https://hexdocs.pm/elixir 并开始在搜索字段中输入。它具有智能自动完成功能。任何未记录的内容都被视为实现内部并且在未来的版本中可能已更改,恕不另行通知。
猜你喜欢
  • 2020-02-16
  • 1970-01-01
  • 2017-04-24
  • 2010-11-06
  • 2016-04-02
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
相关资源
最近更新 更多