предложение защиты is_module в elixir

#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, то, что вы запрашиваете, невозможно.