我正在将模块传递给函数,并希望使用保护子句(函数被设计为:atom或module)传递给它。
如何检查函数中的参数是否为模块(如is_atom
为原子?)
答案 0 :(得分:3)
仅使用防护条款是不可能的。我会在函数体中使用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
答案 1 :(得分:0)
模块名称是一个原子,所以除了检查is_atom之外,你要求的是不可能的。