Ruby in zwanzig Minuten
Beachten Sie also die ersten Zeilen unseres neuen Programms, die mit einem Rautenzeichen (#) beginnen. In Ruby ist alles auf einer Zeile nach einem Rautenzeichen ein Kommentar und wird vom Interpreter ignoriert. Die erste Zeile der Datei ist ein Sonderfall und gibt unter einem Unix-ähnlichen Betriebssystem der Shell an, wie die Datei ausgeführt werden soll. Die restlichen Kommentare dienen nur der Übersichtlichkeit.
Unsere say_hi Methode ist etwas kniffliger geworden
# Say hi to everybody
def say_hi
if @names.nil?
puts "..."
elsif @names.respond_to?("each")
# @names is a list of some kind, iterate!
@names.each do |name|
puts "Hello #{name}!"
end
else
puts "Hello #{@names}!"
end
endSie betrachtet jetzt die Instanzvariable @names, um Entscheidungen zu treffen. Wenn sie nil ist, gibt sie einfach drei Punkte aus. Es macht keinen Sinn, niemanden zu begrüßen, oder?
Radfahren und Schleifen – aka Iteration
Wenn das @names-Objekt auf each reagiert, kann es über etwas iteriert werden. Also iterieren Sie darüber und begrüßen Sie jede Person der Reihe nach. Schließlich, wenn @names etwas anderes ist, lassen Sie es einfach automatisch in eine Zeichenkette umgewandelt werden und machen Sie die Standardbegrüßung.
Betrachten wir diesen Iterator genauer
@names.each do |name|
puts "Hello #{name}!"
endeach ist eine Methode, die einen Codeblock akzeptiert und diesen Codeblock dann für jedes Element einer Liste ausführt, und der Teil zwischen do und end ist ein solcher Block. Ein Block ist wie eine anonyme Funktion oder ein Lambda. Die Variable zwischen den senkrechten Strichen ist der Parameter für diesen Block.
Was hier passiert, ist, dass für jeden Eintrag in einer Liste name an dieses Listenelement gebunden wird, und dann wird der Ausdruck puts "Hello #{name}!" mit diesem Namen ausgeführt.
Die meisten anderen Programmiersprachen handhaben das Durchlaufen einer Liste mit der for-Schleife, die in C ungefähr so aussieht:
for (i=0; i<number_of_elements; i++)
{
do_something_with(element[i]);
}Das funktioniert, ist aber nicht sehr elegant. Sie benötigen eine Wegwerfvariable wie i, müssen herausfinden, wie lang die Liste ist, und müssen erklären, wie über die Liste gelaufen wird. Der Ruby-Weg ist viel eleganter, alle organisatorischen Details sind innerhalb der each-Methode versteckt, Sie müssen ihr nur sagen, was mit jedem Element geschehen soll. Intern ruft die each-Methode im Wesentlichen yield "Albert" auf, dann yield "Brenda" und dann yield "Charles" und so weiter.
Blöcke, der hochglänzende Funke am Rande von Ruby
Die wahre Stärke von Blöcken liegt im Umgang mit Dingen, die komplizierter sind als Listen. Über die einfache Bewältigung organisatorischer Details innerhalb der Methode hinaus können Sie auch Einrichtung, Abbau und Fehler behandeln – alles vom Benutzer verborgen.
# Say bye to everybody
def say_bye
if @names.nil?
puts "..."
elsif @names.respond_to?("join")
# Join the list elements with commas
puts "Goodbye #{@names.join(", ")}. Come back soon!"
else
puts "Goodbye #{@names}. Come back soon!"
end
endDie say_bye-Methode verwendet nicht each, stattdessen prüft sie, ob @names auf die join-Methode reagiert, und wenn ja, verwendet sie diese. Andernfalls gibt sie einfach die Variable als Zeichenkette aus. Diese Methode, sich nicht um den eigentlichen Typ einer Variablen zu kümmern, sondern sich nur darauf zu verlassen, welche Methoden sie unterstützt, wird als „Duck Typing“ bezeichnet, wie in „Wenn es wie eine Ente läuft und wie eine Ente quakt…“. Der Vorteil davon ist, dass die unterstützten Variablentypen nicht unnötig eingeschränkt werden. Wenn jemand eine neue Art von Listenklasse entwickelt, solange diese die join-Methode mit denselben Semantiken wie andere Listen implementiert, wird alles wie geplant funktionieren.
Das Skript starten
Das ist also die MegaGreeter-Klasse, der Rest der Datei ruft nur Methoden dieser Klasse auf. Es gibt einen letzten Trick zu beachten, und das ist die Zeile
if __FILE__ == $0__FILE__ ist die magische Variable, die den Namen der aktuellen Datei enthält. $0 ist der Name der Datei, die zum Starten des Programms verwendet wird. Diese Prüfung besagt: „Wenn dies die Hauptdatei ist, die verwendet wird…“. Dies ermöglicht es, eine Datei als Bibliothek zu verwenden und keinen Code in diesem Kontext auszuführen, aber wenn die Datei als ausführbare Datei verwendet wird, dann diesen Code auszuführen.
Betrachten Sie sich als vorgestellt
Das war es also für den schnellen Überblick über Ruby. Es gibt noch viel mehr zu entdecken: die verschiedenen Kontrollstrukturen, die Ruby bietet; die Verwendung von Blöcken und yield; Module als Mixins; und mehr. Ich hoffe, dieser Eindruck von Ruby hat Sie neugierig auf mehr gemacht.
Wenn ja, begeben Sie sich bitte in unseren Bereich Dokumentation, der Links zu Handbüchern und Tutorials zusammenfasst, die alle kostenlos online verfügbar sind.