Des blocs, des Proc et des lambdas (dénommé fermetures en Sciences de l'Informatique) sont l'un des aspects les plus puissants de Ruby, et aussi l'un des plus mal compris. C'est probablement parce que Ruby poignées fermetures dans un lieu unique manière. Rendre les choses plus compliquées, c'est que Ruby a quatre façons différentes d'utiliser les fermetures, dont chacun est un peu différent, et parfois absurdes. Il existe assez peu de sites avec de très bonnes informations sur la façon de fermetures de travail au sein de Ruby. Mais je n'ai pas encore trouver un bon guide définitif là-bas.
class Array
def iterate!(&code)
self.each_with_index do |n, i|
self[i] = code.call(n)
end
end
end
array = [1, 2, 3, 4]
array.iterate! do |n|
n ** 2
end
Les procédures, les AKA, les Procs
Les blocs sont très pratique et d'un point de vue syntaxique simple, cependant, on peut vouloir avoir beaucoup de différents blocs à notre disposition et de les utiliser plusieurs fois. En tant que tel, en passant le même bloc, encore et encore, nous obligerait à répéter soi-même. Cependant, comme le Rubis est totalement orienté objet, cela peut être manipulé très proprement en enregistrant le code réutilisable comme un objet en soi. Ce code réutilisable est appelé un Proc (de procédure). La seule différence entre les blocs et le Proc est qu'un bloc est un Proc qui ne peut être sauvé, et en tant que tel, est un temps d'utilisation de la solution. En travaillant avec les Procs, nous pouvons commencer à faire le suivant:
class Array
def iterate!(code)
self.each_with_index do |n, i|
self[i] = code.call(n)
end
end
end
array_1 = [1, 2, 3, 4]
array_2 = [2, 3, 4, 5]
square = Proc.new do |n|
n ** 2
end
Les Lambdas
Jusqu'à présent, vous avez utilisé Procs de deux façons, en passant directement comme un attribut et de les enregistrer en tant que variable. Ces Procs loi très similaire à ce que d'autres langues de l'appel des fonctions anonymes, ou les lambdas. Pour rendre les choses plus intéressantes, les lambdas sont disponibles au sein de Ruby trop. Prendre un coup d'oeil:
class Array
def iterate!(code)
self.each_with_index do |n, i|
self[i] = code.call(n)
end
end
end
array = [1, 2, 3, 4]
array.iterate!(lambda { |n| n ** 2 })
puts array.inspect
Les blocs
La plus commune, la plus simple et sans doute le plus "Ruby comme" manière d'utiliser les fermetures en Ruby, c'est avec des blocs. Ils ont syntaxe familière:
array = [1, 2, 3, 4]
array.collect! do |n|
n ** 2
end
puts array.inspect
# => [1, 4, 9, 16]