Sztuką jest w przy użyciu &
który mówi Ruby przekonwertować ten argument do Proc
jeśli to konieczne i następnie użyj obiektu jako bloku metody. Począwszy od wersji 1.9, istnieje skrót do funkcji lambda (anonimowych). Tak, można napisać kod tak:
(1..5).map &->(x){ x*x }
# => [1, 4, 9, 16, 25]
weźmie każdy element tablicy i obliczyć jego moc
to jest taki sam jak ten kod:
func = ->(x) { x*x }
(1..5).map &func
Ruby 1.8:
(1..5).map &lambda {|x| x*x}
# => [1, 4, 9, 16, 25]
w celu rozwiązania tego problemu można użyć metody Array reduce
(0
jest wartość początkowa):
('A'..'K').reduce(0) { |sum,elem| sum + elem.size }
# => 11
Podjęcie funkcji lambda do reduce
jest nieco skomplikowane, ale anonimowy blok jest prawie taka sama jak lambda.
('A'..'K').reduce(0) { |sum, elem| ->(sum){ sum + 1}.call(sum) }
# => 11
Albo można Concat litery podobnie jak ten:
('A'..'K').reduce(:+)
=> "ABCDEFGHIJK"
Konwersja na małe litery:
('A'..'K').map &->(a){ a.downcase }
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]
W kontekście definicji metody, kładąc ampersanda przed ostatnią parametr wskazuje, że metoda może przyjąć blok i podaje nam nazwę, która odnosi się do tego bloku w treści metody.