#elixir
#elixir
Вопрос:
Я передаю модуль функции и хочу использовать защитные предложения (функция предназначена для передачи ей:atom или module).
Как я могу проверить, что аргумент в функции является модулем (например is_atom
, для атомов?)
Ответ №1:
Это невозможно только с защитными предложениями. Я бы использовал 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. Хм, как я могу использовать это как защитное предложение в моей функции?
2. Пожалуйста, посмотрите мою правку. Это невозможно в защитных предложениях.
is_atom
это единственная проверка, которую вы можете выполнить в guard, которая устранит вещи, которые не могут быть модулями, но она не может проверить, существует ли модуль.3. Хм, я не хочу проверять наличие существующего модуля, я хочу проверить, что модуль передается вместо atom
4. Модуль — это просто атом.
Foo
является синтаксическим сахаром для:"Elixir.Foo"
в Elixir.
Ответ №2:
Имя модуля — ЭТО атом, поэтому, кроме проверки is_atom, то, что вы запрашиваете, невозможно.