Что такое функции взрыва эликсира?
Сначала я заметил функцию с завершающим восклицательным знаком/ударом (!), проходя через учебник Phoenix (в разделе Входящие события)
def handle_in("new_msg", %{"body" => body}, socket) do
broadcast! socket, "new_msg", %{body: body}
{:noreply, socket}
end
Что означает завершающий восклицательный знак? Он что-то делает? Я искал и искал, но я не уверен, что использую правильные условия. Пока кажется, что функция только как соглашение вызовет ошибку, если она терпит неудачу, но всегда она всегда означает это.
Единственные упоминания, которые я вижу из этого, появляются в "Программировании эликсира" Дейва Томаса:
Identifiers in Elixir are combinations of upper and lower case ASCII
characters, digits, and underscores. Function names may end with a
question mark or an exclamation point.
А также в документации он упоминает:
Notice that when the file does not exist, the version with ! raises an
error. The version without ! is preferred when you want to handle
different outcomes using pattern matching...
Ни один из них не объясняет, является ли это конвенцией, что другие эликсиристы или алхимики или что-то другое. Пожалуйста, помогите.
Ответы
Ответ 1
Это:
Обратите внимание, что когда файл не существует, версия с! поднимает ошибка. Версия без! предпочтительнее, когда вы хотите обрабатывать разные результаты с использованием сопоставления шаблонов...
будет более понятным, если вы посмотрите на исходный код. Символ !
в имени функции является просто синтаксическим соглашением. Если вы видите функцию, содержащую символ !
в своем имени, это означает, что, вероятно, есть функция с тем же именем, но без символа !
. Обе эти функции будут делать то же самое, но они будут обрабатывать ошибки по-другому.
Функция без !
просто вернет вам ошибку. Вам нужно будет знать тип ошибки, и ее обработка зависит от вашего типа. Посмотрите на функцию broadcast/3
(вариант без !
):
def broadcast(server, topic, message) when is_atom(server),
do: call(server, :broadcast, [:none, topic, message])
Он просто вызывает вызов данному серверу и вернет его результат. Функция broadcast!/3
будет делать то же самое, но: она вызовет функцию broadcast
без !
, проверит ее результат и поднимет исключение BroadcastError
:
def broadcast!(server, topic, message) do
case broadcast(server, topic, message) do
:ok -> :ok
{:error, reason} -> raise BroadcastError, message: reason
end
end
Ответ 2
Это просто соглашение об именах. Проверьте этот ответ - В чем смысл "" " ", "" " """ синтаксис в эликсире
! - приведет к возникновению исключения, если функция обнаруживает ошибку.
Один хороший пример - Enum.fetch! (Он также имеет ту же Enum.fetch, которая не вызывает исключение). Задает элемент в указанном индексе (на основе нуля). Вызывает OutOfBoundsError, если данная позиция находится за пределами диапазона коллекции.
Ответ 3
В основном вы правильно поняли Марк - это соглашение, чтобы сказать, ПОДТВЕРЖДАЙТЕ ОШИБКУ, если все пойдет не так.
На этой странице есть документация, в которой говорится о доступе к файлу
(прокрутите вниз до фразы trailing bang)