Procs und Lambdas
Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy. Lektion 19 von 56.
Ein Block ist kein Objekt, du kannst ihn nicht in einer Variablen speichern. Wenn du einen Codeabschnitt weitergeben, speichern und später aufrufen möchtest, verpackst du ihn in ein Proc oder ein lambda.
Ein Proc wird mit Proc.new oder dem Schlüsselwort proc erstellt. Rufe ihn mit .call auf:
double = proc { |n| n * 2 }
puts double.call(5) # 10
puts double.call(7) # 14Eine Lambda-Funktion ist ähnlich, aber strenger: Sie überprüft, ob du die richtige Anzahl an Argumenten übergibst. 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 ihnen & vorangestellt wird:
[1, 2, 3].map(&double) # [2, 4, 6]
[1, 2, 3].map(&square) # [1, 4, 9]Verwende ein Lambda, wenn du eine strengere Argumentprüfung möchtest; verwende ein Proc, wenn du ein weniger strenges, nachsichtigeres Verhalten möchtest.
Aufgabe
EinfachErstelle eine Lambda-Funktion namens tripler, die eine Zahl entgegennimmt und sie mit 3 multipliziert zurückgibt.
Lies dann eine durch Kommas getrennte Liste von Ganzzahlen ein und gib in separaten Zeilen Folgendes aus:
- Das Ergebnis des Aufrufs von
tripler.call(10) - Die verdreifachten Eingabezahlen (verwende
map(&tripler)), verbunden mit,
Für die Eingabe 1,2,3 lautet die Ausgabe:
30
3, 6, 9Probier 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, mappe numbers mit &tripler, 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
Überblick über String-MethodenString-InterpolationStrings durchlaufenSplitten und VerbindenRückblick – String Weaver4Blocks, Procs & Lambdas
Was ist ein Block?do..end vs. geschweifte KlammernDas Schlüsselwort yieldBlock-ParameterProcs und LambdasRückblick – Benutzerdefinierter Iterator2Bereiche
Was ist ein Bereich?BereichsmethodenBereiche in Case / WhenWiederholung – Übung zu Bereichen5Das Enumerable-Kraftpaket
Select und RejectMap verkettenReduce / Injectcount, all?, any?, none?group_by und partitionsort_by, min_by, max_byZusammenfassung – Datenpipeline8Fortgeschrittene Entscheidungsfindung
Case mit Klassen & Regexwhen mit mehreren WertenTernärer OperatorInline-if / unlessRückblick – NotenklassifiziererÜbe selbstständig: Online-Ruby-Compiler