Procs und Lambdas
Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy — Lektion 19 von 56.
Ein Block ist kein Objekt, man kann ihn nicht in einer Variablen speichern. Wenn Sie ein Stück Code haben möchten, das Sie herumreichen, speichern und später aufrufen können, verpacken Sie es in ein Proc oder ein lambda.
Ein Proc wird mit Proc.new oder dem Schlüsselwort proc erstellt. Rufen Sie es mit .call auf:
double = proc { |n| n * 2 }
puts double.call(5) # 10
puts double.call(7) # 14Ein Lambda ist ähnlich, aber strenger; es prüft, ob Sie die richtige Anzahl an Argumenten übergeben. Die Pfeilform -> ist die übliche Schreibweise:
square = ->(n) { n * n }
puts square.call(4) # 16
puts square.(4) # 16 (Kurzform für .call)Beide können an eine Methode übergeben werden, die einen Block erwartet, indem man ihnen ein & voranstellt:
[1, 2, 3].map(&double) # [2, 4, 6]
[1, 2, 3].map(&square) # [1, 4, 9]Verwenden Sie ein lambda, wenn Sie eine strengere Argumentprüfung wünschen; verwenden Sie ein Proc, wenn Sie ein leichteres, nachsichtigeres Verhalten wünschen.
Aufgabe
EinfachErstellen Sie ein Lambda namens tripler, das eine Zahl entgegennimmt und diese mit 3 multipliziert zurückgibt.
Lesen Sie dann eine durch Kommas getrennte Liste von Ganzzahlen ein und geben Sie folgendes in separaten Zeilen aus:
- Das Ergebnis des Aufrufs von
tripler.call(10) - Die verdreifachten Eingabezahlen (verwenden Sie
map(&tripler)), verbunden mit,
Für die Eingabe 1,2,3 lautet die Ausgabe:
30
3, 6, 9Spickzettel
Proc – wiederverwendbarer Block, der in einer Variablen gespeichert ist:
double = proc { |n| n * 2 }
double.call(5) # 10Lambda – strengere Argumentprüfung, Arrow-Syntax:
square = ->(n) { n * n }
square.call(4) # 16
square.(4) # 16 (Kurzschreibweise)Übergeben Sie ein Proc/Lambda an eine Methode, die einen Block erwartet, unter Verwendung von &:
[1, 2, 3].map(&double) # [2, 4, 6]Probier es selbst
# TODO: definiere `tripler` als Lambda
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: Zeile 1, gib tripler.call(10) aus
# TODO: Zeile 2, wende map auf numbers mit &tripler an, verbinde mit ", "
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Programmfluss
1Strings im Detail
String-Methoden im ÜberblickString-InterpolationIterieren über StringsSplit und JoinRückblick – String Weaver4Blöcke, Procs & Lambdas
Was ist ein Block?do..end vs. geschweifte KlammernDas yield-SchlüsselwortBlock-ParameterProcs und LambdasZusammenfassung – Eigener Iterator7Hashes Teil 2
Hash.new mit StandardwertenIterieren über HashesVerschachtelte HashesZusammenführen und TransformierenRückblick – Häufigkeitszähler10Projekt - Studentenverwaltung
ProjektübersichtStudent hinzufügen5Enumerable-Kraftpaket
Select und RejectMap-VerkettungReduce / Injectcount, all?, any?, none?group_by und partitionsort_by, min_by, max_byZusammenfassung – Data Pipeline8Fortgeschrittene Entscheidungslogik
Case mit Klassen & RegexMulti-Value whenTernärer OperatorInline if / unlessRückblick – Noten-Klassifizierer