Вот один пример анонимной функции в Ruby (в данном случае она называется block ):
my_array.each{ |item| puts item }
Где вышеописанная анонимная функция? Да, это тот, который получает один параметр, называет его «item», а затем печатает его. В JavaScript вышеприведенное может быть записано как ...
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); });
... что несколько упрощает передачу функции в качестве аргумента, а также помогает оценить синтаксис Ruby. :)
Вот еще одна анонимная функция (обратно в Ruby):
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!
Хотя пример явно надуманный, он показывает, как вы можете создать новую функцию (в данном случае с именем count ) и назначить ее переменной и использовать ее для рекурсивных вызовов внутри метода master. (Некоторые считают, что это лучше, чем создание второго метода только для рекурсии или повторное использование основного метода для рекурсии с очень разными параметрами.)
Функция не имеет имени, переменная имеет. Вы можете назначить его любому количеству переменных, все с разными именами.
Возвращаясь к первому примеру, в Ruby даже есть синтаксис для передачи лямбды в виде одного благословенного блока:
print_it = lambda{ |item| puts item }
%w[a b c].each(&print_it)
#=> a
#=> b
#=> c
... но вы также можете передать лямбду как обычный параметр и вызвать его позже, как показано здесь:
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