Ruby for Newbies Iteratoren und Blöcke

Ruby ist eine der beliebtesten Sprachen im Internet. Wir haben hier auf Nettuts + eine neue Screencast-Serie gestartet, die Sie in Ruby einführen wird, sowie die großartigen Frameworks und Werkzeuge, die mit der Entwicklung von Ruby einhergehen. In diesem Kapitel sprechen wir über Blöcke und Iteratoren.


Aufholen

  • Lektion 1: Ruby installieren und loslegen
  • Lektion 2: Variablen, Datentypen und Dateien 
  • Lektion 3: Mit Klassen arbeiten
  • Lektion 4: Conditionals und Loops
  • Lektion 5: Iteratoren und Blöcke

Screencast anzeigen


Blöcke

In der letzten Stunde haben wir über Schleifen gesprochen. Sie werden Schleifen in Ruby eigentlich nicht allzu oft verwenden, weil eine Funktion aufgerufen wird Blöcke (und als Ergebnis von Block-Iteratoren). Um Ihr Gedächtnis aufzufrischen, schauen Sie sich die folgenden zwei Methodenaufrufe an (Sie können dies in IRB versuchen):

name = "Joe" name.reverse # => "eoJ" name.concat ("der Klempner") # => "Joe der Klempner"

Wie Sie wissen, sind die Klammern nach dem Methodenaufruf normalerweise optional. Wir werden heute lernen, wann sie benötigt werden.

Hier sind also die Teile eines Methodenaufrufs:

  • Das Objekt, das die Methode erhält; Name über.
  • Der Punkt.
  • Der Methodenname; umkehren oder concat über.
  • Die Argumente; " der Klempner" im zweiten Beispiel oben.
  • Der Codeblock; Bleib dran!

Die ersten drei Teile sind offensichtlich erforderlich. Die Argumente und der Codeblock sind optional. Was ist dieser Codeblock? Sehen Sie sich dieses Beispiel an und wir besprechen es dann:

sites = ["net", "psd", "mobile"] sites.map! do | site | site + = ".tutsplus.com" End-Sites # => ["net.tutsplus.com", "psd.tutsplus.com", "mobile.tutsplus.com"]

In diesem Fall das Array Websites ist der Empfänger; die methode ist Karte!. Als nächstes haben wir den Block. Wenn der Block mehrzeilig ist, können Sie die Schlüsselwörter verwenden tun und Ende es abzugrenzen Wenn Sie es in eine einzige Zeile setzen, können Sie geschweifte Klammern verwenden (diese funktionieren auch für mehrzeilige Blöcke)..

Nach dem Öffnen des Blocks haben wir die Blockparameter innerhalb der Pipes ( | ). Was das wirklich ist, hängt von der Methode ab, die Sie ausführen. Blöcke werden am häufigsten in Iterator-Methoden verwendet, daher ist der Blockparameter das aktuelle Element in der Schleife. Wenn das ziemlich abstrakt klingt, werden wir einige Beispiele anführen.


Iteratoren

Wir beginnen mit den Iteratoren von Arrays, da diese am häufigsten durchgeschleift werden.

Anstelle einer for-Schleife verwenden Sie wahrscheinlich jeder:

sites = ["net", "psd", "mobile"] sites.each | site | setzt "# site .tutsplus.com" # net.tutsplus.com # psd.tutsplus.com # mobile.tutsplus.com

Dies ist wie bei einer for-Schleife; nacheinander, jedes Element in Websites wird dem Blockparameter zugewiesen Seite? ˅; Dann wird der Code innerhalb des Blocks ausgeführt.

Wenn Sie neugierig sind, die jeder Methode gibt das ursprüngliche Array zurück.

Manchmal möchten Sie einen Wert aus dem Block zurückgeben. Das ist nicht schwer, wenn Sie die richtige Methode verwenden.

# Angenommen, Sites über Sites = Sites.map do | s | "# s .tutsplus.com" Ende

Das Karte Die Methode sammelt alle Werte, die von jeder Iteration des Blocks zurückgegeben werden. Dann wird ein Array dieser Werte von der Methode zurückgegeben. In diesem Fall weisen wir das neu zu Websites Variable in das neue Array.

Es gibt jedoch einen besseren Weg, dies zu tun. Mehrere Ruby-Methoden haben Duplikate mit dem Ausrufezeichen (oder dem Knall); Das bedeutet, dass sie destruktiv sind: Sie ersetzen den Wert, an dem sie arbeiten. Das Obige könnte also folgendermaßen gemacht werden:

sites.map! | site_prefix | "# site_prefix .tutsplus.com"

Jetzt, Websites wird das von dem Block zurückgegebene Array von Werten sein.

Mehr als nur Arrays verfügen jedoch über Iterator-Methoden. Zahlen haben eine ziemlich coole mal Methode:

5 mal do | i | setzt "Schleifennummer # i" Ende # Schleifennummer 0 # Schleifennummer 1 # Schleifennummer 2 # Schleifennummer 3 # Schleifennummer 4

Wenn Sie mit dem Codieren von Ruby fortfahren, finden Sie viele nützliche Methoden, die Blöcke verwenden. Nun wollen wir mal sehen, wie wir unsere eigenen Blöcke erstellen.


Bausteine

Nun, da Sie sich mit der Verwendung von Blöcken auskennen, wollen wir sehen, wie Sie Methoden schreiben, die sie nutzen. Hier sind zwei weitere Block-Leckerbissen, die Sie noch nicht gelernt haben:

  • Blockparameter sind nicht erforderlich. Sie können einen Block schreiben, der sie nicht verwendet.
  • Blöcke selbst können optional sein. Sie können eine Funktion schreiben, die mit oder ohne Blöcke arbeitet.

So rufen Sie eine Methode auf, die einen Block benötigt. Hinter den Kulissen führt Ruby einen Methodencode aus und gibt dann den Blockcode nach. Danach wird die Kontrolle an die Methode zurückgegeben. Lass es uns überprüfen.

Da die meisten der einfachen Iteratorfunktionen in Ruby integriert sind, wird eine davon neu geschrieben. Lass uns das machen jeder Methode auf Arrays:

Klassenarray def each2 i = 0; während self [i] self [i] ergibt, i + = 1 end self end end

Wie Sie sehen, ist dies nur eine normale Methode. Denken Sie daran, dass innerhalb einer Instanzmethode die selbst Schlüsselwort bezieht sich in diesem Fall auf die Instanz der Klasse, Array. Innerhalb der Methode verwenden wir eine while-Schleife, um die Elemente im Array zu überarbeiten. In der Schleife verwenden wir dann die Ausbeute Stichwort. Wir übergeben es selbst [i]; das wird am Ende der Blockparameter sein. Danach erhöhen wir uns ich für die Schleife und weiter.

Wenn wir wollten, dass diese Methode das Array von Werten zurückgibt, das der Block zurückgegeben hat, können wir einfach den zurückgegebenen Wert erfassen Ausbeute und das zurückgeben, statt selbst, Wir geben dieses Array zurück.

class Array def each2_returning_new_values ​​i = 0; new_vals = []; während self [i] new_vals [i] = Flows self [i] i + = 1 end new_vals end endet

Methoden, überarbeitet

Zum Schluss wollen wir über Methoden reden. Wir wissen, dass die Verwendung von Klammern optional ist ... meistens. Hier ist, wenn Sie beim Aufruf der Methode die Klammer verwenden müssen.

Manchmal haben Sie beide Methodenparameter und einen Block.

obj.some_method "param" | x | #blockcode hier

Was ich gerade getan habe, funktioniert nicht. In diesem Fall müssen Klammern verwendet werden, da der Block sonst dem letzten Parameter zugeordnet wird. Dies ist nur der Fall, wenn Sie den Block mit geschweiften Klammern abgrenzen. wenn du benutzt tun - Ende, die Klammern sind nicht erforderlich.

Die andere Zeit ist in Klammern erforderlich, wenn Sie einen literalen Hash (keine Variable, die auf einen Hash zeigt) als ersten Parameter der Methode übergeben. Ruby wird denken, dass es wegen der geschweiften Klammer ein Block ist

arr.push : name => "Andrew" # schlägt fehl! arr.push (: name => "" Andrew ") # Durchläuft