我想知道是否有NotImplementedError
我可以通过的标准Kernel.raise/1
。我很好奇我是否可以弄清楚(不仅仅是尝试)该模块是否存在。
更一般地说,能够搜索甚至只是列出iex
会话的所有“可用”模块似乎很有用。
这个问题与其他问题类似:
但是这个问题是在询问“[Elixir] 标准库模块”。我想检索或生成一个(Elixir)列表(即我可以进一步操作的 Elixir 值)加载到特定会话中或以其他方式“可用”的所有模块。iex
我想知道是否有NotImplementedError
我可以通过的标准Kernel.raise/1
。我很好奇我是否可以弄清楚(不仅仅是尝试)该模块是否存在。
更一般地说,能够搜索甚至只是列出iex
会话的所有“可用”模块似乎很有用。
这个问题与其他问题类似:
但是这个问题是在询问“[Elixir] 标准库模块”。我想检索或生成一个(Elixir)列表(即我可以进一步操作的 Elixir 值)加载到特定会话中或以其他方式“可用”的所有模块。iex
回答提出的问题
我很好奇我是否可以弄清楚(不仅仅是尝试)该模块是否存在。
有Code.ensure_loaded?/1
哪一个确实做到了这一点。
Code.ensure_loaded?(Atom)
#⇒ true
我在 Elixir 论坛上找到了这篇文章:
一条注释指向IEx.Autocomplete
Elixir 源代码中模块中的一个函数:
以下是函数使用的函数,所有函数都位于同一文件的下方:
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
.