Aquí hay una ex amplia de una función anónima en Ruby (llamado un bloque en este caso):
my_array.each{ |item| puts item }
¿Dónde está la función anónima en el anterior? Por qué, es el que recibe un único parámetro, lo nombra 'artículo' y luego lo imprime. En JavaScript, lo anterior puede escribirse como ...
Array.prototype.each = function(anon){
for (var i=0,len=this.length;i<len;++i) anon(this[i]);
};
myArray.each(function(item){ console.log(item); });
... el que tanto hace que sea un poco más claro que una función se pasa como argumento, y también ayuda a apreciar la sintaxis de Ruby . :)
Aquí es otra función anónima (de vuelta en Rubí):
def count_to(n)
puts "I'm going to count to #{n}"
count = lambda do |i|
if (i>0)
count[i-1]
puts i
end
end
count[n]
puts "I'm done counting!"
end
count_to(3)
#=> I'm going to count to 3
#=> 1
#=> 2
#=> 3
#=> I'm done counting!
Aunque el ejemplo es obviamente artificial, que muestra cómo se puede crear una nueva función (en este caso llamado recuento) y asignar a una variable, y usar eso para llamadas recursivas dentro de un método maestro. (Algunos creen que esto es mejor que crear un segundo método solo para la recursión, o reutilizar el método maestro para la recursión con parámetros muy diferentes).
La función no tiene nombre, la variable sí. Podría asignarlo a cualquier cantidad de variables, todas con diferentes nombres.
Volviendo al primer ejemplo, hay incluso una sintaxis en Ruby para hacer pasar un lambda como el solo, bloque bendito:
print_it = lambda{ |item| puts item }
%w[a b c].each(&print_it)
#=> a
#=> b
#=> c
... pero también se puede pasar una lambda como un parámetro normal y llamada más tarde, como se ilustra aquí:
module Enumerable
def do_both_to_each(f1, f2)
each do |item|
f1[item]
f2[item]
end
end
end
print_prefix = lambda{ |i| print "#{i}*#{i} -> " }
print_squared = lambda{ |i| puts i*i }
(1..4).do_both_to_each(print_prefix,print_squared)
#=> 1*1 -> 1
#=> 2*2 -> 4
#=> 3*3 -> 9
#=> 4*4 -> 16
Es "función anónima", un término utilizado con mayor frecuencia en la comunidad Perl? –
Y la comunidad javascript. Y los llamarías expresiones lambda en lisp/scheme. – 0112