Cuando trabajamos con funciones en Elixir, a menudo nos encontramos con la necesidad de pasar funciones existentes como parámetros a otras funciones. Aunque las funciones anónimas son muy útiles para esto, muchas veces la función que queremos utilizar ya está definida en alguna librería, y no queremos ni necesitamos reescribirla. Por ejemplo, imaginemos que queremos usar la función rem, que nos devuelve el resto de una división.
El problema es que no podemos simplemente pasar rem como si fuera una variable, porque en Elixir las funciones no son variables en sí mismas. rem es un identificador de función dentro del módulo Kernel, y no está disponible como un valor que podamos manipular directamente. Entonces, ¿cómo podemos pasar esa función para usarla como parámetro?
La solución está en capturar la función. Capturar una función no significa secuestrarla ni nada por el estilo, sino convertir esa función que ya existe en un módulo en una expresión que podamos tratar como una variable. Esto nos permite pasarla, almacenarla o reutilizarla fácilmente.
Para capturar una función en Elixir, usamos el operador ampersand &. Este operador nos permite referenciar una función existente junto con su aridad, que es el número de argumentos que recibe. Por ejemplo, para capturar la función rem que recibe dos argumentos, escribimos &rem/2. Esto crea una función anónima que podemos asignar a una variable o pasar como parámetro.
Al hacer esto, puede que veamos que la función capturada aparece como perteneciente a Erlang, por ejemplo, :erlang.rem. Esto ocurre porque muchas funciones nativas de Elixir son simplemente atajos a funciones de la librería estándar de Erlang. Erlang utiliza átomos para nombrar sus módulos, y Elixir aprovecha estas funciones sin necesidad de reinventarlas.
Si queremos capturar otra función que forma parte de un módulo, como String.trim, simplemente escribimos &String.trim/1. Así, podemos asignar esta función a una variable, por ejemplo:
recortar = &String.trim/1
A partir de aquí, recortar es una variable que contiene una función, y podemos aplicarla usando la sintaxis de llamada a función anónima:
recortar.(" hola ")
# Resultado: "hola"
Volviendo al ejemplo de rem, si queremos usarla en una función que espera recibir una función como parámetro, primero la capturamos:
rem2 = &rem/2
Y luego podemos pasar rem2 donde necesitemos, trabajando con ella como una función anónima.
Es importante recordar que para capturar una función debemos usar el ampersand y especificar la aridad correcta. Olvidar cualquiera de estos detalles es un error común, especialmente al principio, pero con la práctica se vuelve natural.
En definitiva, capturar funciones en Elixir con el operador & nos permite transformar funciones existentes en valores que podemos manipular, facilitando la reutilización y el paso de funciones como parámetros en nuestros programas.