Puedo estar equivocado ya que nadie lo mencionó, pero también tenía la impresión de que la razón de esto también es la herencia rubí de poder llamar funciones sin corchetes.
Obviamente, Arity está involucrada, pero dejemos de lado por un tiempo y usemos funciones sin argumentos. En un lenguaje como javascript, donde los corchetes son obligatorios, es fácil hacer la diferencia entre pasar una función como argumento y llamar a la función. Lo llamas solo cuando usas los corchetes.
my_function // argument
(function() {}) // argument
my_function() // function is called
(function() {})() // function is called
Como puede ver, nombrarlo o no no hace una gran diferencia. Pero el elixir y el rubí le permiten llamar a funciones sin los corchetes. Esta es una opción de diseño que personalmente me gusta, pero tiene este efecto secundario que no puede usar solo el nombre sin los corchetes porque podría significar que desea llamar a la función. Esto es para lo que &
sirve. Si deja Arity aparte por un segundo, anteponer el nombre de su función &
significa que quiere explícitamente usar esta función como argumento, no lo que devuelve esta función.
Ahora la función anónima es un poco diferente, ya que se usa principalmente como argumento. Nuevamente, esta es una opción de diseño, pero la razón detrás de esto es que es utilizada principalmente por el tipo de funciones iteradoras que toman funciones como argumentos. Obviamente, no es necesario usarlo &
porque ya se consideran argumentos por defecto. Es su proposito.
Ahora, el último problema es que a veces tiene que llamarlos en su código, porque no siempre se usan con un tipo de función de iterador, o podría estar codificando un iterador usted mismo. Para la pequeña historia, dado que el rubí está orientado a objetos, la forma principal de hacerlo era usar el call
método en el objeto. De esa manera, podría mantener el comportamiento de los corchetes no obligatorios consistente.
my_lambda.call
my_lambda.call()
my_lambda_with_arguments.call :h2g2, 42
my_lambda_with_arguments.call(:h2g2, 42)
Ahora a alguien se le ocurrió un atajo que básicamente parece un método sin nombre.
my_lambda.()
my_lambda_with_arguments.(:h2g2, 42)
Nuevamente, esta es una opción de diseño. Ahora el elixir no está orientado a objetos y, por lo tanto, no use la primera forma con seguridad. No puedo hablar por José, pero parece que la segunda forma se usó en elixir porque todavía parece una llamada de función con un carácter adicional. Está lo suficientemente cerca de una llamada de función.
No pensé en todos los pros y los contras, pero parece que en ambos idiomas podrías salirte con los corchetes siempre que los corchetes sean obligatorios para las funciones anónimas. Parece que es:
Paréntesis obligatorios VS notación ligeramente diferente
En ambos casos, hace una excepción porque hace que ambos se comporten de manera diferente. Como hay una diferencia, es mejor que lo hagas obvio e ir por la notación diferente. Los corchetes obligatorios se verían naturales en la mayoría de los casos, pero muy confusos cuando las cosas no salen según lo planeado.
Aqui tienes. Ahora, esta podría no ser la mejor explicación del mundo porque simplifiqué la mayoría de los detalles. Además, la mayoría son opciones de diseño y traté de darles una razón sin juzgarlas. Me encanta el elixir, me encanta el rubí, me gustan las llamadas de función sin paréntesis, pero como tú, las consecuencias me parecen bastante equivocadas de vez en cuando.
Y en el elixir, es solo este punto extra, mientras que en el rubí tienes bloques encima. Los bloques son increíbles y me sorprende lo mucho que puedes hacer con solo bloques, pero solo funcionan cuando necesitas una sola función anónima, que es el último argumento. Entonces, dado que debería poder lidiar con otros escenarios, aquí viene todo el método / lambda / proc / block confusion.
De todos modos ... esto está fuera de alcance.