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.
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:
Name
über.umkehren
oder concat
über." der Klempner"
im zweiten Beispiel oben.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.
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.
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:
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
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