【发布时间】:2018-01-05 22:58:53
【问题描述】:
我将模块传递给函数并希望使用保护子句(函数被设计为具有 :atom 或模块)传递给它。
如何检查函数中的参数是否为模块(例如 is_atom 表示原子?)
【问题讨论】:
标签: elixir
我将模块传递给函数并希望使用保护子句(函数被设计为具有 :atom 或模块)传递给它。
如何检查函数中的参数是否为模块(例如 is_atom 表示原子?)
【问题讨论】:
标签: elixir
仅使用保护子句是不可能的。为此,我会在函数体中使用Code.ensure_loaded?/1。除了模块存在与否返回true/false之外,如果在代码路径中能找到对应的beam文件,也会尝试加载模块:
iex(1)> defmodule A do
...(1)> end
iex(2)> Code.ensure_loaded?(A)
true
iex(3)> Code.ensure_loaded?(B)
false
iex(4)> Code.ensure_loaded?(Map)
true
iex(5)> Code.ensure_loaded?(:maps)
true
# I created `a.beam` using `erlc` in the same folder as `iex` was started
iex(6)> Code.ensure_loaded?(:a)
true
【讨论】:
is_atom 是您可以在警卫中执行的唯一检查,它将消除不可能是模块的东西,但它无法检查模块是否存在。
Foo 是 Elixir 中 :"Elixir.Foo" 的语法糖。
模块名称是一个原子,因此除了检查 is_atom 之外,您请求的内容是不可能的。
【讨论】: