Das yield-Schlüsselwort
Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy — Lektion 17 von 56.
Methoden, die Sie selbst definieren, können einen Block entgegennehmen, genau wie die eingebauten. Innerhalb der Methode führt das Schlüsselwort yield den Block aus, den der Aufrufer übergeben hat.
def greet
puts "Before block"
yield
puts "After block"
end
greet do
puts "Hi from the block!"
end
# Before block
# Hi from the block!
# After blockDu kannst Argumente an den Block übergeben, indem du sie an yield übergibst:
def with_each(items)
items.each { |item| yield item }
end
with_each([10, 20, 30]) { |n| puts n }
# 10
# 20
# 30Wenn eine Methode yield aufruft, der Aufrufer aber keinen Block übergeben hat, löst Ruby einen Fehler aus. Mit block_given? können Sie dies vorher prüfen:
def maybe
yield if block_given?
end
maybe # nichts passiert
maybe { puts "called!" } # aufgerufen!Aufgabe
EinfachDefinieren Sie eine Methode namens repeat, die ein Argument n (eine Ganzzahl) entgegennimmt und die Werte 1, 2, ..., n nacheinander an ihren Block übergibt (yield).
Rufen Sie dann Ihre Methode mit n = 4 und einem Block auf, der "Got <value>" für jeden übergebenen Wert ausgibt.
Die Ausgabe lautet:
Got 1
Got 2
Got 3
Got 4Spickzettel
Verwenden Sie yield innerhalb einer Methode, um den vom Aufrufer übergebenen Block auszuführen:
def greet
yield
end
greet { puts "Hi!" } # Hi!Übergeben Sie Argumente an den Block mittels yield:
def with_each(items)
items.each { |item| yield item }
end
with_each([1, 2]) { |n| puts n }Verwenden Sie block_given?, um zu prüfen, ob ein Block bereitgestellt wurde, bevor yield aufgerufen wird:
def maybe
yield if block_given?
endProbier es selbst
# TODO: definiere `repeat`, das 1..n an seinen Block übergibt
# TODO: rufe repeat(4) mit einem Block auf, der "Got <value>" ausgibt
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