Le truc, c'est à l'aide d'un &
qui dit Ruby pour convertir cet argument à un Proc
, si nécessaire, et ensuite utiliser l'objet comme la méthode du bloc. À partir de Ruby 1.9 il y a un raccourci pour lambda (anonyme) de fonctions. Donc, vous pouvez écrire du code comme ceci:
(1..5).map &->(x){ x*x }
# => [1, 4, 9, 16, 25]
aura lieu à chaque élément du tableau et calculer sa puissance
c'est le même que ce code:
func = ->(x) { x*x }
(1..5).map &func
pour Ruby 1.8:
(1..5).map &lambda {|x| x*x}
# => [1, 4, 9, 16, 25]
Pour résoudre votre problème, vous pouvez utiliser le Tableau de la méthode de reduce
(0
est la valeur initiale):
('A'..'K').reduce(0) { |sum,elem| sum + elem.size }
# => 11
Passage d'une fonction lambda d' reduce
est un peu délicat, mais le bloc anonyme est à peu près le même que lambda.
('A'..'K').reduce(0) { |sum, elem| ->(sum){ sum + 1}.call(sum) }
# => 11
Ou vous pourriez concat lettres comme cela:
('A'..'K').reduce(:+)
=> "ABCDEFGHIJK"
Convertir en minuscules:
('A'..'K').map &->(a){ a.downcase }
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]
Dans le contexte d'une définition de la méthode, de mettre une esperluette devant le dernier paramètre indique qu'une méthode peut prendre un bloc et nous donne un nom pour désigner ce bloc dans le corps de la méthode.