Подтвердить что ты не робот

Что такое функции взрыва эликсира?

Сначала я заметил функцию с завершающим восклицательным знаком/ударом (!), проходя через учебник 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...

Ни один из них не объясняет, является ли это конвенцией, что другие эликсиристы или алхимики или что-то другое. Пожалуйста, помогите.

4b9b3361

Ответ 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)