Procki i lambdy
Część sekcji Logika i przepływ programu ścieżki Ruby w Coddy. Lekcja 19 z 56.
Blok nie jest obiektem, nie możesz przechowywać go w zmiennej. Jeśli chcesz mieć fragment kodu, który możesz przekazywać dalej, zapisywać i wywoływać później, opakuj go w Proc lub lambda.
Obiekt Proc tworzy się za pomocą Proc.new lub słowa kluczowego proc. Wywołaj go za pomocą .call:
double = proc { |n| n * 2 }
puts double.call(5) # 10
puts double.call(7) # 14Lambdy są podobne, ale bardziej rygorystyczne — sprawdzają, czy przekazujesz odpowiednią liczbę argumentów. Zapis ze strzałką -> jest powszechnie używany:
square = ->(n) { n * n }
puts square.call(4) # 16
puts square.(4) # 16 (skrócony zapis .call)Obie można przekazać do metody oczekującej bloku, poprzedzając je znakiem &:
[1, 2, 3].map(&double) # [2, 4, 6]
[1, 2, 3].map(&square) # [1, 4, 9]Użyj lambdy, gdy chcesz bardziej rygorystycznego sprawdzania argumentów; użyj obiektu Proc, gdy chcesz lżejszego i bardziej tolerancyjnego działania.
Wyzwanie
ŁatwyUtwórz lambdę o nazwie tripler, która przyjmuje jedną liczbę i zwraca ją pomnożoną przez 3.
Następnie wczytaj listę liczb całkowitych rozdzielonych przecinkami i wypisz w osobnych wierszach:
- Wynik wywołania
tripler.call(10) - Liczby wejściowe pomnożone przez 3 (użyj
map(&tripler)) i połączone za pomocą,
Dla wejścia 1,2,3 wynikiem jest:
30
3, 6, 9Spróbuj swoich sił
# TODO: zdefiniuj `tripler` jako lambdę
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: w wierszu 1 wypisz tripler.call(10)
# TODO: w wierszu 2 przekształć numbers za pomocą &tripler, połącz separatorem ", "
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ programu
1Łańcuchy znaków w szczegółach
Przegląd metod łańcuchów znakówInterpolacja łańcuchów znakówIterowanie po łańcuchach znakówDzielenie i łączeniePowtórka – Tkacz łańcuchów znaków4Bloki, procki i lambdy
Czym jest blok?do..end a nawiasy klamroweSłowo kluczowe yieldParametry blokuProcki i lambdyPodsumowanie — własny iterator7Hashe, część 2
Hash.new z wartościami domyślnymiIterowanie po haszachZagnieżdżone haszeŁączenie i przekształcaniePowtórka — licznik częstotliwości10Projekt – ewidencja uczniów
Przegląd projektuDodawanie ucznia5Potęga Enumerable
Select i RejectŁączenie wywołań mapReduce / Injectcount, all?, any?, none?group_by i partitionsort_by, min_by, max_byPodsumowanie — potok danych8Zaawansowane podejmowanie decyzji
case z klasami i wyrażeniami regularnymiwhen z wieloma wartościamiOperator trójargumentowyInline if / unlessPowtórka – klasyfikator ocenPoćwicz samodzielnie: Kompilator Ruby online