Я хотел бы добавить, как я начал делать константы, которая похожа на ответ @Onorio Catenacci, но использует процитировать:
defmodule IbGib.Constants do
@doc """
Use this with `use IbGib.Constants, :ib_gib`
"""
def ib_gib do
quote do
defp delim, do: "^"
defp min_id_length, do: 1
# etc...
end
end
@doc """
Use this with `use IbGib.Constants, :error_msgs`
"""
def error_msgs do
quote do
defp emsg_invalid_relations do
"Something about the rel8ns is invalid. :/"
end
# etc...
end
end
@doc """
When used, dispatch to the appropriate controller/view/etc.
"""
defmacro __using__(which) when is_atom(which) do
apply(__MODULE__, which, [])
end
end
А потом использовать его как это в верхней части модуля, в котором вы хотите, чтобы потреблять их:
use IbGib.Constants, :ib_gib # < specifies only the ib_gib constants
use IbGib.Constants, :error_msgs
# ... then in some function
Logger.error emsg_invalid_relations
Я получил это с тем, как Феникс делает импорт/использование предложений с MyApp.Web. Я нигде не знаком с экспертом Elixir, но с помощью этого метода вы можете импортировать только те константы, которые вы хотите, и вам не нужно префикс их с помощью какого-либо пространства имен/scoping. Таким образом, вы можете легко выбирать и выбирать отдельные группы констант.
С прямыми функциями (я думаю) вам придется разбить их на несколько модулей, а затем импортировать модуль.
Я не знаю оптимизации последствия этого против прямых функций модуля, но я думал, что это было очень аккуратно - особенно для практики между различными способами «импорт» вещи в эликсира (import
, use
, alias
, require
является очень запутанный, как новичок, поступающий с других языков, где это один оператор using
или import
).
EDIT: Я изменил константу def
объявлений на defp
. Это связано с тем, что когда несколько модулей import
файла констант, существует конфликт двусмысленности. Изменение их для функций, ограниченных в частном порядке, позволяет избежать этого конфликта. Поэтому каждый модуль имеет свою собственную «частную копию» той же константы.
, но @my_favorite_num ber нельзя получить извне модуля –
@lfx_cool правильно. если вы хотите получить доступ к нему извне модуля, вы можете определить функцию, которая возвращает свое значение: 'def my_favorite_number, do: @ my_favorite_number' – AbM
Это метод getter, если у нас есть ярлыки для этого, например. attr_reader: my_favorite_number –