Menu
Coddy logo textTech

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)   # 14

Ein 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.

challenge icon

Aufgabe

Einfach

Erstellen 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:

  1. Das Ergebnis des Aufrufs von tripler.call(10)
  2. Die verdreifachten Eingabezahlen (verwenden Sie map(&tripler)), verbunden mit ,

Für die Eingabe 1,2,3 lautet die Ausgabe:

30
3, 6, 9

Spickzettel

Proc – wiederverwendbarer Block, der in einer Variablen gespeichert ist:

double = proc { |n| n * 2 }
double.call(5)   # 10

Lambda – 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 ", "
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Programmfluss