tutorial mac language framework español elixir phoenix-framework

elixir - mac - phoenix framework tutorial



¿Qué son las funciones de Elixir Bang? (3)

La primera vez que noté una función con un signo de exclamación / bang (!) Al final del tutorial de Phoenix (en la sección Eventos entrantes )

def handle_in("new_msg", %{"body" => body}, socket) do broadcast! socket, "new_msg", %{body: body} {:noreply, socket} end

¿Qué significa el signo de exclamación al final? ¿Hace algo? He estado buscando y probando, pero no estoy seguro de que esté usando los términos correctos. Hasta ahora parece que la función solo como una convención generará un error si falla, pero siempre significa eso.

Las únicas menciones que veo aparecen en "Programming Elixir" de Dave Thomas:

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.

Y también en la documentación se menciona:

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...

Ninguno de estos explica si esta es una convención que otros elixiristas o alquimistas o cualquier otro uso. Por favor ayuda.


Básicamente, entiendes bien, Marc. Es una convención decir "HACER UN ERROR" si las cosas van mal.

Hay documentación, de un tipo, en esta page que habla sobre el acceso a archivos (desplácese hacia abajo hasta la frase final )


Es sólo una convención de nomenclatura. Comprueba esta respuesta: ¿Cuál es el significado de "!", "?", "_" Y "." sintaxis en elixir

! - Se producirá una excepción si la función encuentra un error.

Un buen ejemplo es Enum.fetch! (También tiene un mismo Enum.fetch que no genera excepciones). Encuentra el elemento en el índice dado (basado en cero). Aumenta OutOfBoundsError si la posición dada está fuera del rango de la colección.


Esta:

Tenga en cuenta que cuando el archivo no existe, la versión con! plantea un error. La versión sin! es preferible cuando quiere manejar diferentes resultados utilizando la coincidencia de patrones ...

Será más claro si miras el código fuente. El El símbolo en el nombre de una función es solo un acuerdo sintáctico. Si ves una función que contiene el ! símbolo en su nombre, significa que probablemente hay una función con el mismo nombre, pero sin ! símbolo. Ambas funciones harán lo mismo, pero manejarán los errores de una manera diferente.

La función sin ! sólo te devolverá un error. Deberá conocer un tipo de error y manejarlo, dependiendo de su tipo. Busque en la función de broadcast/3 ( variant sin ! ):

def broadcast(server, topic, message) when is_atom(server), do: call(server, :broadcast, [:none, topic, message])

Simplemente hace una llamada al servidor dado y devolverá su resultado. La función broadcast!/3 hará lo mismo, pero: ¡llamará a la función broadcast sin ! , comprobará su resultado y generará la exception BroadcastError :

def broadcast!(server, topic, message) do case broadcast(server, topic, message) do :ok -> :ok {:error, reason} -> raise BroadcastError, message: reason end end