
dieses handbuch steckt voller leben!

dank Why’s Ergreifender Einführung…



tenderly written and illustrated by


Licensed under the Attribution-ShareAlike license.
See http://creativecommons.org/licenses/by-sa/2.0/ for details.
![[o]](i/chapter.poignant.guide-1.jpg)

dieses handbuch steckt voller leben!

dank Why’s Ergreifender Einführung…


![[o]](i/chapter.poignant.guide-2.jpg)
Nehmen wir an, du hast dieses Buch geöffnet (obwohl du es vielleicht tatsächlich geöffnet hast), und nun hast du die enorme Zwiebel in der Mitte gefunden. (Der Hersteller hat die Zwiebel dort auf meinen Wunsch hin eingeheftet.)
Du denkst dir: “Wow, da ist ja eine Zwiebel dabei!” (Auch wenn du Zwiebeln nicht unbedingt magst, wirst du sicher die Logistik zu würdigen wissen, die nötig ist, um Gemüse in angeblichen Programmier-Handbüchern zu verstecken.)
Dann fragst du dich: “Moment mal. Ich dachte, das wäre ein Buch über Ruby, diese unglaubliche neue Programmiersprache aus Japan. Auch wenn ich die Logistik zu würdigen weiß, die nötig ist, um Gemüse in angeblichen Programmier-Handbüchern zu verstecken: Warum eine Zwiebel? Was soll ich damit anfangen?”
Nein. Bitte jetzt nicht darüber sinnieren. Du sollst überhaupt nichts damit anfangen. Leg die Zwiebel beiseite und lass sie etwas mit dir tun.
Ich will ehrlich mit dir sein: Ich will, dass du weinen musst. Heulen. Schluchzen. Dieses Buch ist eine ergreifende Einführung in Ruby. Das bedeutet, dass der Code so schön ist, dass man Tränen vergießt. Das heißt herzergreifende Geschichten und düstere Wahrheiten, die dich am nächsten Morgen in den Armen des Buches aufwachen lassen. Den ganzen Tag lang drückst du das Buch an dich. Wenn nötig, mach dir eine Innentasche in deinen Bademantel für Why’s (ergreifende) Einführung in Ruby, so dass du immer und überalle die süße Gesellschaft dieses Buches genießen kannst.
Du musst wirklich wimmern. Wenigstens einmal. Zumindest schniefen. Und wenn nicht, dann wird die Zwiebel für alles sorgen.
Probier’s mal mit diesem ergreifenden Stück Text:
Einmal ging ich gerade eine dieser geschäftigen Straßen voller Automärkte entlang (das war kurz nachdem meine Hochzeit abgesagt wurde), als ich einen ausgesetzten Hund auf der Straße fand. So ein wolliger, schwarzer Hund mit grünlich-roten Augen. Da ich mich auch ziemlich ausgesetzt fühlte, nahm ich ein paar Ballons, die am Pfosten eines Automarktes befestigt waren, und machte sie an sein Halsband. Dann entschied ich, dass er mein Hund sein würde. Ich nannte ihn Bigelow.
Wir machten uns auf, um Bigelow ein paar Hundeknochen zu kaufen und danach zu mir nach Hause zu gehen, wo wir uns in Sesseln ausruhen und Gorky’s Zygotic Mynci hören konnten. Ach, und vorher mussten wir noch zu einem Gebrauchtwarenladen, um Bigelow seinen eigenen Sessel zu besorgen.
Aber Bigelow hatte mich nicht als Herrchen akzeptiert. Fünf Minuten später ging dieser blöde Hund in eine andere Richtung und ich fand ihn nie wieder. Wenn er vorher einmal verloren gegangen war, so war er es jetzt zweimal. Also verlangsamte ich meine Schritte hin zu einem Leben mit Hundeknochen und Extrasesseln. Für fünf Minuten hatte ich einen Hund gehabt.
Dieser Benedict Arnold von Hund. Ich saß auf einer Parkbank und warf Kienäpfel nach einer Statue von drei Schafen auf einer Brücke. Danach weinte ich stundenlang. Die Tränen kamen einfach. Hier hast du also etwas Ergreifendes zum warm werden.
Ich frage mich, wo er mit den ganzen Ballons hin ist. Dieser verrückte Hund muss ausgesehen haben wie eine Party auf vier Beinen.
Wenig später hatte ich meinen eigenen Bigelow gefunden. Ich druckte einen Haufen Zeug über Ruby aus. Artikel, die ich im Netz gefunden hatte. Ich überflog sie später auf einer Bahnfahrt nach Hause. Ich blätterte fünf Minuten und gab auf. Nicht überzeugend.
Ich saß da, starrte aus dem Fenster auf die Welt, einen bombastischer Mixer vor Augen, der Graffiti und Eisen verrührt. Diese Welt ist zu große für so eine kleine Sprache, dachte ich. Das arme kleine Ding hat keine Chance. Hat keine Beine zum Stehen. Keine Arme zum Schwimmen.
Ja, da war es. Ein kleiner Mann in einem winzigkleinen Zug (zu der Zeit hatte ich immer noch einen Milchzahn) inmitten von Milliarden Menschen auf einem schwebenden blauen Stein. Wer bin ich, über Ruby zu urteilen? Woher weiß ich, dass ich nicht aus Versehen mein Handy verschlucke und noch am Abend sterbe? Why ist tot, es lebe Ruby.
Der Grabstein:
Was stoppte seine Atmung?
Da schau, es ist ein Samsung!
Mein Glück. Endlich bekomme ich einen guten, langen Schlaf unter der Erde, nur manchmal unterbrochen von Pachelbel’s Kanon aus meinen Bauch.
Jetzt fragst du dich, wieso ich meine Meinung über Ruby geändert habe. Die Antwort: Es hat einfach ==klick== gemacht. Wir passten zusammen.
So wie wenn du Jemand in der Schule begegnest, und dieser Jemand sieht aus wie ein anderer, der dich als Kind immer mit Pinseln ins Gesicht gehauen hat. Und so, ganz instinktiv, folgerst du, dass Jemand kein Freund sein kann. Du ziepst Jemand an den Haaren. Du legst das Telefon laut auf, wenn Jemand zu der wichtigsten Stelle seiner Geschichte kommen will. Du fährst mit deinen Rollschuhen dort, wo Jemand gerade laufen will!
Und irgendwie, sechs Monate später, sitzen du und Jemand an einem Springbrunnen und ihr plaudert wie die besten Freunde. Jemand sieht gar nicht so sehr wie dein Kindheitsalptraum aus. Du hast den guten Zwilling getroffen. Es hat ==klick== gemacht.
Obwohl ich dir vielleicht die Zähne ausschlagen sollte mit dem ganzen Rummel um Ruby und all den einschlägigen Abkürzungen und Buzzwords, die eng mit Ruby verbunden sind (das Zeug, bei dem deine Chefs und deren Chefs sofort die Ohren spitzen), werde ich dich einfach kosten lassen. Ich werden dich durch etwas Code fallen lassen, nur gelegentlich werde ich ein paar eigene Herzenserfahrungen einwerfen. Es wird ganz einfach und natürlich sein.
Ich sollte dich allerdings ein wenig motivieren. Also, Smotchkkiss, ich werde dir meine drei besten Gründe geben, Ruby zu lernen.
Vitamin R. Geht direkt in deinen Kopf. Ruby wird dir beibringen, deine Gedanken durch einen Computer auszudrücken. Du wirst Geschichten für eine Maschine schreiben.
Kreativ sein, kreative Leute kennen lernen. Kombinieren. Begründen. Intelligent nicken. Die Sprache wird zu einem Werkzeug, um deine Gedanken besser mit der Welt zu verbinden. Ich habe bemerkt, dass viele erfahrene Ruby-Benutzer offenbar klare, objektive Denker sind. (Im Gegensatz zu: extrem befangen und ungehobelt.)
Ruby wurde in Japan geboren. Das ist ziemlich komisch. Japan ist nicht gerade für seine Software bekannt. Und da Programmiersprachen meist in Englisch geschrieben werden, wer würde eine Sprache aus Japan erwarten?
Und doch, hier haben wir Ruby. Gegen alle Wetten hat Yukihiro Matsumoto am 24. Februar 1993 Ruby geschaffen. In den letzten zehn Jahren hat er unermüdlich gearbeitet, um Ruby der Weltöffentlichkeit näher zu bringen. Es ist triumphal und edel usw. Unterstütze die Vielfalt. Hilf uns, ein wenig an der Erde zu wackeln.
Ruby zu benutzen kostet nichts. Ruby’s Quellcode steht jedermann zum Ein- und Ausatmen zur Verfügung. Deshalb ist dieses Buch auch kostenlos. Es ist alles Teil eines elephantösen Werbegeschenks, das irgend einen Riesenhaken haben sollte.
Du denkst, wir wollen dir Staubsauger oder gefälschte Monets andrehen. Du denkst, es wird eine 90-minütige Präsentation geben, bei der am Ende der Besitzer der Firma ankommt und dir einen Vertrag aufdrängelt.
Nö. Gratis, frei, kostenlos.
Jetzt ist es Zeit, dass das Buch anfängt. Du kannst jetzt deinen Textmarker rausholen und anfangen, jedes Wort anzustreichen, dass dich besonders fasziniert. Ich denke, ich habe genug Haarspray und Falschgeld bei mir, um bis zur letzten Seite durchzuhalten.
Falls du jemals ein Buch gelesen hast, dann weißt du, dass kein Buch ohne eine bombastische Menge an Synergie anfangen kann. Ja, Synergie. Vielleicht wusstest du das nicht. Synergie bedeutet, dass du und ich zusammenarbeiten, um das hier zu einem großartigen Lese-Erlebnis zu machen.
Wir fangen das Buch an, indem wir in der Einführung gut miteinander auskommen. Dieses Zusammenspiel, diese Synergie, treibt uns voran durch das Buch, mit mir als Reiseführer. Du gibst mir ein beruhigendes Nicken oder Kichern, um deine Fortschritte zu zeigen.
Ich bin Peter Pan, der deine Hand hält. Komm, Wendy! Der zweite Stern von links und weiter bis zum Morgengrauen.
Ein Problem noch. Ich komme nicht gut mit Leuten klar. Ich kann nicht so gut Händchen halten.
Meine Mitarbeiter werden es dir bestätigen. Auf der Eröffnungsfeier Dieses Buches (die in dem Fußballstadion) hatte ich entdeckt, dass die Gurkensandwiches nicht in Geschirrtüchern serviert wurden. Das Ergebnis war, dass sich die Butter nicht richtig mit den Gurken vermischt hatte… Wie auch immer, jedenfalls habe ich einen Aufstand gemacht und ein paar der Werbe-Lastwagen draußen in Brand gesteckt. Ich habe diesen Scheinwerfer zertrümmert und so weiter. Bis tief in der Nacht hatte ich diese laute, wahnsinnige Lache. Es war ein Riesendurcheinander.
Aber, da ich nicht gut mit Leuten klarkomme, war niemand außer mir zu der Eröffnungsfeier Dieses Buches eingeladen. Es war also nicht wirklich derart peinlich. Ich habe es geheim gehalten, und niemand hat etwas von der ganzen Tortur mitbekommen.
Du musst wissen, dass Synergie in diesem Buch nicht wirklich Synergie bedeutet. Ich kann keine normale Synergie. Nein, in diesem Buch bedeutet Synergie stattdessen Comicfüchse. Ich meine damit: Dieses Buch fängt an mit einer bombastischen Menge an Comicfüchsen.
Und ich zähle auf dich, sie in Synergie zu verwandeln.
![[o]](i/chapter.poignant.guide-3.jpg)

f: Wem sagst du das.
f: Ich hab’ 50% im Voraus gekriegt.
f: Ich sag’s dir. Bei diesen Typen geht’s nur auf die harte Tour.
Ja, das sind die beiden. Oh, mein Asthma schon wieder…ich muss kurz mal ein bisschen Medizin einatmen, bin gleich wieder da.

f: Keine Beine.
f: Tja. Die sind in der Zwischenablage von Photoshop.
f: Oh Mann. Bete, dass es OS X ist.
Man hat mir gesagt, dass du für dieses Kapitel am besten einen Mop zur Hand hast; irgendwas, womit du dir dein Gesicht abwischen kannst, wenn dir der Schweiß von der Stirn trieft.
In der Tat werden wir die gesamte Sprache durchgehen. Als wenn man alle Streichhölzer aus einer Packung gleichzeitig anzündet.

Mein Gewissen verbietet mir, Ruby als Computersprache zu bezeichnen. Das würde bedeuten, dass sie vorrangig mit Computerbegriffen arbeitet. Dass die Sprache vor allem für den Computer entworfen wurde. Dass also wir, die Programmierer, Fremde sind, die in die Heimat des Computers einwandern wollen. Es ist die Sprache des Computers, und wir sind Übersetzer für die Welt.
Aber wie nennst du eine Sprache, wenn dein Gehirn anfängt, in dieses Sprache zu denken? Wenn du beginnst, Worte und Redewendungen aus der Sprache zu benutzen, um dich auszudrücken. Nun, der Computer kann das nicht machen. Wie kann es dann eine Computersprache sein? Es ist unsere, wir sprechen sie von Natur aus!
Wir können sie nicht mehr wirklich als Computersprache bezeichnen. Sie ist Programmierersprache. Sie ist die Sprache unserer Gedanken.
Lies folgendes Beispiel laut vor.
5.times { print "Odelay!" }
In englischen Sätzen sind Satzzeichen (Punkte, Klammern, Satzzeichen) stumm. Satzzeichen geben den Wörtern zusätzliche Bedeutung, sie helfen uns, den Sinn des Satzes zu verstehen. Also lesen wir das Beispiel als: Five times print “Odelay!”. – Drucke fünf mal “Odelay!”.
Und genau das tut dieses kleine Ruby-Programm. Beck’s mutierter spanischer Ausruf wird fünfmal auf den Bildschirm geschrieben.
Lies folgendes Beispiel laut vor.
exit unless "restaurant".include? "aura"
Kurze Anmerkung des Übersetzers: Die deutsche Sprache eignet sich sehr schlecht zum Übersetzen dieser Codes, da ihr Satzbau sich vom englischen massiv unterscheidet. Ich hoffe, dass der Leser der englischen Sprache mächtig ist und die Beispiele im Original genießen kann.
Hier machen wir einen kleinen Praxis-Test. Unser Programm wird sich beenden (exit), es sei denn (unless – Englisch für “es-sei-denn”, “wenn-nicht”; ein Wort, das es im Deutschen nicht gibt) das Wort restaurant enthält (include?) etwas, und zwar das Wort aura. Nochmal, auf Englisch: Exit unless the word restaurant includes the word aura. Nochmal, auf Deutsch: Beenden, wenn das Wort Restaurant nicht das Wort aura enthält.
Hast du jemals eine Programmiersprache gesehen, die Fragezeichen so effektiv einsetzt? Ruby benutzt Satzzeichen wie Ausrufe- und Fragezeichen, um die Lesbarkeit des Codes zu erhöhen. Im obigen Code fragen wir etwas; warum das nicht auch deutlich machen?
Lies folgendes Beispiel laut vor.
['toast', 'käse', 'wein'].each { |wort| print wort.capitalize }
['toast', 'cheese', 'wine'].each { |food| print food.capitalize }
each (engl. jedes) und capitalize (engl. groß schreiben) werden nicht übersetzt, weil es sich um Ruby-Standardfunktionen handelt.
Obwohl dieses Codestück weniger lesbar und satzartig ist als die vorigen, schlage ich dir vor, es laut vorzulesen. Obwohl Ruby manchmal wie Englisch aussieht, ist es eher eine Art Kurz-Englisch. Vollständig ins Englische übersetzt könnte man das Beispiel so lesen: With the words ‘toast’, ‘cheese’, and ‘wine’: take each food and print it capitalized. Oder auf Deutsch: Mit den Wörtern ‘toast’, ‘käse’ und ‘wein’: nimm jedes Wort und drucke es in Großschreibung.
Der Computer antwortet höflich: 'Toast, 'Käse und 'Wein.
An diesem Punkt fragst du dich vielleicht, wie diese Wörter zusammenarbeiten. Smotchkkiss fragt sich, was der Punkt und die geschweiften Klammern bedeuten. Ich werde die verschiedenen Wortarten im Folgenden behandlen.
Alles, was du im Moment wissen musst, ist: Ruby ist grundsätzlich aus Sätzen aufgebaut. Es sind nicht wirklich englische Sätze. Es sind kurze Zeilen aus Worten und Zeichen, die einen einzelnen Gedanken wiedergeben. Aus diesen Sätzen können Seiten werden. Oder Bücher. Sie können ganze Romane ergeben, wenn man sie zusammenhängt. Romane, die von Menschen gelesen werden können, aber ebenso von Computern.
Wie ein Stinktier auf dem Rücken einen weißen Streifen trägt, oder eine Braut einen wehenden weißen Schleier, so haben auch viele Wortarten in Ruby sichtbare Erkennungsmerkmale. Zeichensetzung und Groß-/Kleinschreibung werden dir helfen, Codestücke zu sehen und sofort wiederzuerkennen. Dein Verstand wird häufig rufen: Hey, dich kenn’ ich doch! Außerdem wirst du in der Lage sein, den Rubyisten-Jargon zu verstehen.
Versuch, dich auf die Optik der einzelnen Wortarten zu konzentrieren. Im Rest des Buches werden die Besonderheiten vertieft. Ich werde jede Wortwart kurz Beschreiben, aber du musst die Beschreibung nicht sofort verstehen. Am Ende des Kapitels solltest du in der Lage sein, alle Wörter eines Ruby-Programms zu erkennen.
Jedes einfache, kleinbuchstabige Wort ist in Ruby eine Variable. Variablen können aus Buchstaben, Ziffern und Unterstrichen bestehen.
Zum Beispiel
x,y,banane2oderwachtel_am_apparat.
Variablen sind wie Spitznamen. Erinnerst du dich noch, wie alle dich Stink-Peter genannt haben? Irgend jemand rief: “Stink-Peter, komm mal her!” Und irgendwie wussten alle: Stink-Peter, das bist du.
Mit Variablen kannst du etwas, das du häufig benutzt, einen Spitznamen geben. Nehmen wir mal an, du hast ein Waisenhaus. Ein richtig verarmtes Waisenhaus. Und jedesmal, wenn Herr F. Starkbier kommt, um noch ein paar Kinder zu kaufen, bestehst du darauf, dass er einhunderteinundzwangzig Euro und acht Cent für den Teddy des Kindes bezahlt, an dem sich das Kind in den dunkleren Stunden seines alptraumartigen Lebens festhalten möchte.
teddy_steuer = 121.08
Später rufst du ihn an die Kasse (eine frisierte Registrierkasse mit Ruby!) Du musst die fälligen Gebühren zu einem total zusammenrechnen.
total = waisen_steuer + teddy_steuer + trinkgeld
Diese Variablen-Spitznamen sind hilfreich. Und im zwielichtigen Kinderhändlermilieu wird jede Hilfe gebraucht, denke ich.

F: Mann, seine Beispiele sind krank.
f: Psst. 121,08 € sind keine schlechte Teddysteuer.
Der einfachste Zahlentyp ist Integer (Ganze Zahl), eine Ziffernkette, die mit einem Plus- oder Minuszeichen beginnen kann.
Beispielsweise
1,23und-10000.
Punkte sind nicht erlaubt, aber dafür Unterstriche. Wenn du also die Tausender abgrenzen möchtest, um die Zahl lesbarer zu machen, nimm den Unterstrich:
einwohner = 12_000_000_000
Dezimalzahlen werden in Ruby Floats genannt. Floats sind Ziffernketten mit Nachkommastellen und/oder einem Exponenten.
Punktierte Anmerkung des Übersetzers: Im Englischen, Japanischen und in Ruby trennt man Dezimalzahlen mit einem Punkt anstatt mit einem Komma ab. Ab jetzt also Nachpunktstellen.
Beispiele sind
3.14,-808.08und12.043e-04.
Delikate Anmerkung des Übersetzers: Mein Beileid allen Informatiklehrern, die jedes Jahr ausgelacht werden, wenn sie ihren Schülern etwas über Strings (englisch string = Faden, Kette, Saite) erklären wollen. Um das klarzustellen: Es geht hier nicht um Reizwäsche und Badehöschen. Es geht einfach nur um Zeichenketten. seufz
Strings sind beliebige Zeichen (Buchstaben, Ziffern, Satzzeichen) in Anführungsstrichen. Man benutzt sowohl einfache als auch doppelte Anführungsstriche, um Strings zu erzeugen.
Beispiele:
"Unterwasserlabor",'2021'oder"Diese Comics sind zum Totlachen!".
Wenn du Zeichen in Anführungsstriche setzt, werden sie zusammen in einem String gespeichert.
Denk an einen Reporter, der das Gebrabbel irgendeines Stars notiert: “Ich bin jetzt viel schlauer”, sagt Avril Lavigne. “Jetzt weiß ich, wie das im Business läuft—was man tun muss und wie ich weiterkomme.”
avril_zitat = "Ich bin jetzt viel schlauer.
Jetzt weiß ich, wie das im Business läuft --
was man tun muss und wie ich weiterkomme."Genauso, wie wir eine Zahl in der Variable teddy_steuer gespeichert haben, speichern wir jetzt eine Zeichenkette (String) in der Variable avril_zitat. Der Reporter schickt das Zitat an die Druckerei, die zufälligerweise Ruby zur Steuerung ihrer Druckpresse benutzt.
print oprah_zitat
print avril_zitat
print ashlee_simpson_debakel
F: Ruf mal irgendwas! Vielleicht benutzt er es für seine Beispiele!
f: Was denn? Sowas wie “Chunky Bacon”?
Chunky Anmerkung des Übersetzers: Da “Chunky Bacon” inzwischen Kultstatus erreicht hat, werde ich den Teufel tun, es zu übersetzen!
Symbole sind Wörter, genau wie Variablen. Sie bestehen ebenfalls aus Buchstaben, Ziffern und Unterstrichen. Aber sie fangen mit einem Doppelpunkt an.
:a,:boder:ponce_de_leonsind Beispiele.
Symbole sind leichter als Strings. Sie werden dort benutzt, wo man einen String braucht, den man nicht auf dem Bildschirm ausgeben will.
Man könnte sagen, ein Symbol ist ein bisschen einfacher für den Computer. Es ist wie ein Verdauungsmittel. Der Doppelpunkt deutet die kleinen Bläschen an, die aus dem Bauch deines Computers aufsteigen, während er das Symbol verdaut. Ah. Süßes Gefühl der Erleichterung.

Konstanten sind Wörter, wie Variablen, aber sie werden groß geschrieben. Wenn Variablen die in Ruby die Substantive sind, dann kannst du dir Konstanten als Eigennamen vorstellen.
Time,ArrayoderBunnyLakeIstVerschwundenzum Beispiel.
Im Deutschen werden Eigennamen groß geschrieben. Das Brandenburger Tor. Du kannst das Brandenburger Tor nicht einfach umherschieben. Du kannst nicht mal eben entscheiden, dass das Brandenburger Tor irgend etwas anderes sei. Eigennamen sind so. Sie bezeichnen etwas ganz Bestimmtes und verändern sich normalerweise nicht mit der Zeit.
Ebenso können Konstanten nicht verändert werden, nachdem man sie gesetzt hat.
BrandenburgerTor = "Straße des 17. Juni, Berlin-Mitte"
Wenn wir versuchen, diese Konstante zu verändern, wird Ruby sich beschweren. Sowas wird nicht gern gesehen.

F: Komm schon. Echt jetzt. Chunky Bacon.
f: Chunky. Bacon.
Wenn Variablen und Konstanten die Substantive sind, dann sind Methoden sie Verben. Methoden werden üblicherweise an Variablen angehängt, mit einem Punkt. Du hast Methoden schon in Aktion gesehen.
zauntor.oeffnen
Oben ist oeffnen eine Methode. Es ist die Aktion, das Verb. Manchmal wirst du verkettete Aktionen sehen.
zauntor.oeffnen.schliessen
Wir haben dem Computer aufgetragen, das Zauntor zu öffnen und dann sofort wieder zu schließen.
zauntor.offen?
Das ist auch eine Aktion. Wir haben dem Computer gesagt, er soll nachschauen, ob das Tor offen ist. Die Methode könnte auch zauntor.schau_nach_ob_es_offen_ist heißen, aber offen? ist kurz und passt auch. Sowohl Ausrufezeichen als auch Fragezeichen können in Methodennamen benutzt werden.
Eine Methode braucht manchmal noch zusätzliche Informationen, um ihre Aktion auszuführen. Wenn wir wollen, dass der Computer das Tor streicht, sollten wir ihm auch eine Farbe angeben.
Argumente werden ans Ende der Methode angehängt. Sie werden normalerweise in Klammern eingeschlossen und mit Kommas getrennt.
zauntor.streichen( 3, :rot )
Das streicht das Zauntor 3 Schichten in Rot.
Es ist wie ein Korb, gefüllt mit den zusätzlichen Informationen, den die Methode mit sich herumträgt. Die Klammern sind die Henkel des Korbs. Die Kommas sind die Füße der Argumente, die aus dem Korb herausgucken. Das letzte Argument hast seine Füße eingezogen, so dass man sie nicht sieht.
Man kann die Körbe auch aneinanderhängen.
zauntor.streichen( 3, :rot ).trocknen( 30 ).schliessen()
Das streicht das Zauntor in 3 roten Schichten an, lässt es 30 Minuten trocken, und schließt es. Obwohl die letzte Methode keine Argumente hat, kannst du trotzdem Klammern setzen, wenn du magst. Es macht keinen Sinn, einen leeren Korb mit dir herum zu tragen; darum lässt man die Klammern normalerweise weg.
Einige Methoden (wie print) sind Kernel-Methoden. Diese Methoden werden in ganz Ruby verwendet. Weil sie so grundlegend sind, benutzen wir keinen Punkt.
print "Siehst du, kein Punkt."
Genau wie die eben beschriebenen Methoden (auch Instanzmethoden genannt) werden auch Klassenmethoden an Variablen oder Konstanten angehängt. Statt eines Punktes benutzt man einen doppelten Doppelpunkt.
Tor::new( :eiche )
Wie du siehst, wird die Klassenmethode new (“neu”) oft benutzt, um Dinge zu erzeugen. Im obigen Beispiel bitten wir Ruby, ein neues Tor auch Eiche zu bauen. Natürlich braucht Ruby dazu das Wissen, wie man ein Tor baut—und einen Stapel Holz, ein paar Holzarbeiter und diese lagen, wackeligen Zweimannsägen.

Globale Variablen beginnen mit einem Dollarzeichen.
Beispiel:
$x,$1,$chunkyund$CHunKY_bACOn.
Die meisten Variablen sind eher kurzlebig. Manche Teile deines Programms sind wie kleine Häuser. Du gehst rein und sie haben ihre eigenen Variablen. In einem Haus steht papa vielleicht für Archibald, den Handelsreisenden und Skelettsammler. In einem anderen Haus könnte papa Peter repräsentieren, den Löwendompteur mit einer Schwäche für Flanel. Jedes Haus hat seinen eigenen papa.
Mit globalen Variablen kannst du sicherstellen, dass eine Variable in jedem Haus gleich ist. Das Dollarzeichen passt gut. Jeder Haushalt in Amerika respektiert den Wert des Dollars. Die sind verrückt nach dem Zeug. Versuch es mal, klopf an irgend eine amerikanische Tür und biete ihnen Geld an. Ich kann dir versichern, dass die Leute anders reagieren, wenn du ihnen Peter anbietest, den Löwendompteur mit einer Schwäche für Flanel.
Globale Variablen können überall im Programm benutzt werden. Sie geraten niemals außer Sicht.
Variablen, die mit einem at-Zeichen beginnen, sind Instanzvariablen.
Beispiele sind
@x,@ysowie@das_ist_die_chunkychste_scheibe_bacon_die_ich_je_gesehen_habe.
Diese Variablen werden oft benutzt, um Eigenschaften (“Attribute”) zu definieren. Zum Beispiel könntest du Ruby die Breite vom zauntor angeben, indem du die Variable @breite innerhalb von zauntor setzt. Instanzvariablen werden in Ruby dazu verwendet, die Eigenschaften eines Objekts zu definieren.
Stell dir vor, das at-Zeichen steht für Attribut.
Variablen, die mit einem doppeltem at beginnen, sind Klassenvariablen.
Zum Beispiel:
@@x,@@yoder@@ich_nehme_euren_chunky_bacon_und_adoptiere_euch_zwei.
Klassenvariablen werden ebenfalls dazu benutzt, Attribute zu definieren. Aber anstatt ein Attribut für ein einzelnes Ruby-Objekt zu definieren, setzen Klassenvariablen die Eigenschaften für viele verwandte Objekte. Wie Instanzvariablen einem einzelnen zauntor Eigenschaften zuweisen, so setzen Klassenvariablen die Attribute für jedes Tor.
Das doppelte at kann für Attribut aller stehen. Zusätzliche kannst du dir einen Schwarm AT-ATs aus Star Wars vorstellen, die alle unter Rubys Kommando stehen. Du änderst eine Klassenvariable, und nicht nur eine, sondern alle ändern sich.

F: Juchu! Ich hab keine Ahnung was Chunky Bacon ist, aber wir haben’s geschafft!
f: Wir sind im Buch!
Ein Block ist Code in geschweiften Klammern.
2.times { print "Ja, ich habe Chunky Bacon in meinen Beispielen benutzt, aber das war das letzte Mal!" }
Mit Blöcken kannst du eine Reihe von Befehlen gruppieren, um sie in deinem Programm hin- und herzuschieben. Die geschweiften Klammern erinnern an die Zangen einer Krabbe, die den Code gepackt hat und zusammenhält. Wenn du diese zwei Zangen siehst, denk daran, dass der Code dazwischen zu einer einzelnen Einheit komprimiert wurde.
Es ist wie eine dieser “Hello Kitty”-Schachteln, die sie im Supermarkt verkaufen, gefüllt mit winzigen Stiften und mikroskopisch kleinem Papier, alles in eine glitzernde, durchsichtige Mappe gestopft, die du unter deinem Palm verstecken kannst, um geheime Transaktionen durchzuführen. Außer, dass man hier nicht so schielen muss.
Die geschweiften Klammern können auch durch die Worte do und end ersetzt werden, was bei mehrzeiligen Blöcken besser aussieht.
loop do
print "Viel besser."
print "Ah. Mehr Platz!"
print "Mein Rücken hat mich beinahe umgebracht in diesen Krabbenzangen."
endBlockargumente (oder Blockvariablen) sind mehrere Variablen in senkrechten Strichen, getrennt durch Kommas.
Als Beispiele:
|x|,|x,y|und|in_ulm, um_ulm, um_ulm_herum|.
Blockargumente stehen am Anfang eines Blocks.
{ |x,y| x + y }
In diesem Beispiel sind |x,y| die Argumente. Nach den Argumenten kommt ein Stück Code. Der Ausdruck x + y addiert die beiden Argumente.
Stell dir die beiden senkrechten Striche als Tunnel vor. Sie erwecken den Eindruck einer Rutsche, auf der die Variablen nach unten gleiten. (Das x streckt alle Viere von sich, während das y brav die Beine kreuzt.) Diese Rutschbahn agiert als Verbindung zwischen dem Block und der Welt um ihn herum.
Variablen werden über diese Rutsche (oder diesen Tunnel) in den Block übergeben.

F: Ich habe keine Frau. Keine Kinder. Ich werde keine Erben haben.
Das einzige von mir, an das sich die Welt erinnern wird, ist Chunky Bacon.
f: Autsch.
Ein Bereich (englisch range) sind zwei Werte in Klammern, verbunden mit einer Ellipse (Punkt-Punkt oder Punkt-Punkt-Punkt.)
(1..3)ist ein Bereich, der die Zahlen zwischen 1 und 3 darstellt.
('a'..'z')ist ein Bereich, der die Kleinbuchstaben repräsentiert.
Stell sie dir als Akkordeons vor, die man für den Transport zusammengefaltet hat. (Natürlich kannst du ein tolles Selbstwertgefühl aufbauen, wenn du ausgefaltete Akkordeons mit dir herumträgst. Aber manchmal muss man in Selbstzweifeln versinken und sie in der Transportbox verstecken.) Die Klammern sind die Griffe an den Seiten dieses kleineren Taschen-Akkordeons. Die Punkte sind die Kette, die den Balg zusammenhält.
Normalerweise benutzt man nur zwei Punkte. Wenn man den dritten Punkt dazunimmt, wird der letzte Wert des Bereichs ausgenommen.
(0...5)steht für die Zahlen von 0 bis 4.
Wenn du diesen dritten Punkt siehst, denke an ein leicht geöffnetes Akkordeon, gerade weit genug geöffnet, um einen Ton zu spielen. Dieser Ton ist der letzte Wert; er wird vom Wind hinfort geweht.
Erzieherische Anmerkung des Übersetzers: Der Begriff des Arrays, englisch (Daten-)Feld oder Matrix, wird so häufig im Original verwendet, dass er mittlerweile zum Vokabular jedes Programmierers gehört. Ich weigere mich, Array mit Feld zu übersetzen, und überlasse das Wort den Bauern, Physikern und Fußballspielern im Land.
Ein Array ist eine kommagetrennte Liste in eckigen Klammern.
[1, 2, 3]ist ein Array von Zahlen.
['Mantel', 'Handschuhe', 'Snowboard']ist ein Array von Strings.
Stell dir Array wir eine Raupe vor, die in deinen Code eingeheftet wurde. Die beiden Klammern halten die Raupe fest, so dass du im Auge behalten kannst, wo der Kopf und wo der Schwanz ist. Die Kommas sind die Beinchen der Raupe, die zwischen ihren einzelnen Körpersegmenten baumeln.
Es war einmal eine Raupe, deren Beine Kommas waren. Das bedeutete, dass sie sich nach jedem Schritt eine Atempause genehmigte. Die anderen Raupen bewunderten sie dafür und sie entwicklete einen ziemlich dominanten Charakter. Oh, und was für ein Philanthrop sie war! Sie war berühmt dafür, frische Blätter an die weniger Erfolgreichen zu verteilen.
Ja, ein Array ist eine Sammlung von Dingen, aber es hält diese Dinge auch in der gegebenen Reihenfolge.
Ein Hash (englisch Gehacktes) ist eine Art Wörterbuch in geschweiften Klammern. Wörterbücher ordnen Wörtern Erklärungen zu; Ruby tut das mit Pfeilen, bestehend aus einem Ist-Gleich- und einem Größer-Als-Zeichen.
{'A' => 'Aasgeier', 'B' => 'Bachstelze'}, um ein Beispiel zu geben.
Dieses Mal stellen die Klammern kleine Bücher dar: Siehst du, wie sie kleinen, offenen Büchern mit einem Bund in der Mitte ähneln? Sie stehen für das Öffnen und Schließen unseres Wörterbuches.
Stell dir vor, unser Buch hat einen Eintrag pro Seite. Die Kommas sind die Seitenecken, die wir umblättern, um die nächsten Seite zu lesen. Und auf jeder Seite steht ein Wort, gefolgt von einem Pfeil auf die Erklärung.
{
'Name' => 'Peter',
'Beruf' => 'Löwendompteur',
'Schwäche' => 'Flanel'
}Ich vergleiche Hashes nicht mit Wörterbüchern, weil man darin nur Erklärungen speichern könnte. Im letzten Beispiel habe ich perönliche Informationen über Peter gespeichert, den Löwendompteur mit einer Schwäche für Flanel. Hashes sind wie Wörterbücher, weil man sie sehr leicht durchsuchen kann.
Im Gegensatz zu Arrays werden die Einträge in einem Hash nicht in einer bestimmten Reihenfolge gespeichert.

f: Wie die Peanuts?
Ein Regulärer Ausdruck (englisch regular expression oder regexp) ist eine Zeichenkette in Schrägstrichen.
Um Beispiele zu nennen:
/ruby/,/[0-9]+/oder/^\d{3}-\d{3}-\d{4}/.
Reguläre Ausdrücke suchen Wörter oder Muster in Texten. Die Schrägstriche an den Seiten sind Stecknadeln.
Stell dir ein kleines Wort mit Stecknadeln an der Seite vor, dass du über ein Buch hältst. Du gehst damit langsam über den Text, und wenn es in die Nähe eines passenden Wortes kommt, fängt es an zu blinken. Du heftest den regulären Ausdruck in das Buch, genau über die Fundstelle, und die Buchstaben leuchten auf.
Ach, und wenn du die Nadeln in das Buch piekst, niest das Papier: reg-exp!
Regexen sind viel schneller, als du die Buchseiten mit dem Finger abzusuchen kannst. Ruby kann eine Regexp benutzen, um ganze Buchbände schnell zu durchsuchen.
Die unten aufgelisteten Operatoren werden in Ruby benutzt, um zu rechnen oder zu vergleichen. Überfliege sie mal, ein paar erkennst du sicher wieder. Du weißt schon, Addition + und Subtraktion - und so weiter.
** ! ~ * / % + - & << >> | ^ > >= < <= <=> || != =~ !~ && += -= == === .. ... not and or
Ruby hat einige eingebaute Worte voller einzigartiger Bedeutung. Diese Worte können nicht als Variablen benutzt werden oder für deine Zwecke verändert werden. Ein paar haben wir bereits besprochen. Sie sind in einem sicheren Haus, mein Freund. Rühr’ sie an und du kriegst einen offiziellen Syntaxfehler.
alias and BEGIN begin break case class def defined? do else elsif END end ensure false for if in module next nil not or redo rescue retry return self super then true undef unless until when while yield
So weit, so gut. Dies ist die erlesene Gesellschaft der Sprache Ruby. Die nächsten drei Kapitel werden eine richtige Vergnügungsfahrt: Wir kleben die Einzelteile zusammen zu originellen Häppchen (ergreifenden) Codes.
Ich empfehle dir, die Wortarten nochmal zu überfliegen. Schaff dir einen guten Überblick. Im nächsten Abschnitt werde ich dich testen.

f: Jepp.
Ich bin stolz auf dich. Jeder wird dir bestätigen, wie ich mit dir prahle. Wie ich ständig von dieser unglaublichen anonymen Person da draußen rede, die scrollt und liest und scrollt und liest. “Diese Kinder”, sage ich ihnen. “Mann, diese Kinder haben ein echtes Herz. Ich habe nie…” Und ich kann den Satz nicht mal zu Ende bringen, weil ich nur noch am Flennen bin.
Und mein Herz scheint rot durch meine filigrane Haut und sie müssen mir 10ccm JavaScript verabreichen, um mich zurückzuholen. (Ich spreche ziemlich gut an auf Gift im Blut.) Mann, das Zeug haut dir die Pfirsische aus den Kiemen!
Na gut. Du hast dich gut gehalten. Aber jetzt muss ich anfangen, der brutale Oberlehrer zu sein. Ich brauche gute Noten von dir. Bisher hast du nicht mehr getan als mit deinen Augen herumzuwackeln. Sicher, du hast vorhin Unglaubliches geleistet, beim laut vorlesen. Jetzt, Smotchkkiss, brauchen wir ein paar Typ-2-Fertigkeiten (Verstehen).
Lies die benutzen Wortarten laut vor.
5.times { print "Odelay!" }
Vielleicht deckst du diesen Absatz beim Lesen lieber zu, weil dein Blick zur Antwort abschweifen könnte. Wir haben eine Zahl 5, gefolgt von einer Methode .times. Dann die erste Krabbenzange eines Blocks. Die Kernel-Methode print hat keinen Punkt und bekommt einen String "Odelay!". Die zweite Zange schließt den Block.
Lies die benutzen Wortarten laut vor.
exit unless "restaurant".include? "aura"
Genau wie print ist auch exit eine Kernel-Methode. Wenn du bei der großen Liste mit den Schlüsselworten aufgepasst hast, weißt du, dass unless ein Schlüsselwort ist. Der String "restaurant" schmiegt sich an die Methode include?. Und zum Schluss der String "aura".
Lies die benutzen Wortarten laut vor.
['toast', 'käse', 'wein'].each do |wort|
print( wort.capitalize )
endDiese Raupe ist ein echter Feinschmecker. Das Beispiel beginnt mit einem Array. Es enthält drei Strings ‘Toast’, ‘Käse’ und ‘Wein’. Dem Array folgt eine Methode each.
In einem Block finden wir das Block-Argument wort, das auf seine kleine Wasserrutsche in den Block flutscht. Die Methode capitalize wandelt den ersten Buchstaben des Wortes in Großbuchstaben um, das zur Variable wort geworden ist. Der umgewandelte String wird an die Kernel-Methode print weitergegeben.
Schau dir die Beispiele nochmal an, bis du sicher bist, die Einzelteile der Sprache erkannt zu haben. Sie haben alle ihre typischen Merkmale, nicht wahr? Atme tief durch und massiere deine Schläfen. Nun lass und ein wirklich dickes Codestück auseinander nehmen.

f: Ja, hol uns hier raus.
Lies die benutzen Wortarten laut vor.
require 'net/http'
Net::HTTP.start( 'www.ruby-lang.org', 80 ) do |http|
print( http.get( '/en/LICENSE.txt' ).body )
endDie erste Zeile ist ein Methodenaufruf. Die Methode require wird benutzt. Ein String mit dem Inhalt 'net/http' wird ihr übergeben. Diese erste Zeile ist sozusagen ein Satz: Wir haben Ruby gesagt, sie soll ein bisschen Hilfscode laden, nämlich die Bibliothek Net::HTTP.
Die nächsten drei Zeilen gehören zusammen. Die Konstante Net::HTTP stellt die Bibliothek dar, die wir oben geladen haben. Wir benutzen daraus die Methode start. In die Methode senden wir einen String 'www.ruby-lang.org' und die Zahl 80.
Das Wort do öffnet einen Block. Der Block hat eine Blockvariable http. Im Block wird die Methode print aufgerufen. Was wird gedruckt?
Die Variable http hat eine Methode get, die wir aufrufen. In get schicken wir einen String mit dem Pfad '/en/LICENSE.txt'. Jetzt siehst du eine weitere Methode, die an get angehängt wurde: Die Methode body. Dann wird der Block mit end geschlossen.
Alles klar? Nur aus Neugier: Erkennst du, was das Beispiel tut? Hoffentlich siehst du ein paar Muster in Ruby. Wenn nicht, schüttle ein paarmal heftig den Kopf, mit dem Beispiel darin. Der Code sollte in handliche Teile zerfallen.
Zum Beispiel wird dieses Muster ein paarmal verwendet:
Variable . Methode ( Argumente )
Du siehst es innerhalb des Blocks:
http.get( '/en/LICENSE.txt' )
Wir benutzen Ruby, um eine Website zu holen. Du hast HTTP vermutlich schon mit deinem Browser benutzt. HTTP ist das Hypertext Transfer Protocol. HTTP wird benutzt, um Websites über das Internet zu transportieren. Stell dir einen Busfahrer vor, der durch das Internet fährt und uns Websites zurückmitbringt. Auf seiner Mütze stehen die Buchstaben HTTP.
Die Variable http ist dieser Busfahrer. Die Methode ist eine Nachricht (engl. message) an den Busfahrer: Gehe etwas holen (engl. to get = holen), und zwar die Website namens '/en/LICENSE.txt'.
Hier siehst du die Methodenverkettung:
http.get( '/en/LICENSE.txt' ).body
Da wir eine Website vom Busfahrer http zurück bekommen werden, kannst du das auch so lesen:
Website .body
Und diese Zeile:
print( http.get( '/en/LICENSE.txt' ).body )
Dieser Code holt dir eine Website. Wir senden ihr die Nachricht body, die uns das ganze HTML in einem String liefert. Den drucken wir dann mit print. Schau dir an, wie man das Grundmuster Punkt-Methode verketten kann. Das nächste Kapitel wird alle möglichen Arten dieser Ruby-Muster erforschen. Das wird ein Spaß.
So, was tut der Code jetzt? Er schreibt den HTML-Quellcode der Ruby-Homepage auf den Bildschirm. Mit einem webfähigen Busfahrer.

f: Wer klaut sowas?
Jetzt haben wir ein Problem. Ich habe das Gefühl, dass du das Ganze hier viel zu sehr genießt. Und wir haben noch nichtmal das Kapitel erreicht, in dem ich Springseil-Reime benutze, um die beizubringen, wie man XML parst!
Wenn du das das hier schon genießt, dann wird es wirklich schlimm. Zwei Kapitel weiter wirst du deine eigenen Ruby-Programme schreiben. Genauer gesagt ist es fast soweit, dass ich dich dazu bringe, dein eigenes Rollenspiel zu schreiben, dein eigenes Datei-Austausch-Netzwerk (à la BitTorrent), und ein Programm, das echte Zufallszahlen aus dem Internet saugt.

Spass-Maßeinheiten
Aquaplaning | Streichelzoo | W(e)EiR | Schädeltrauma
Und, weißt du (das musst du wissen!), das hier kann zur Besessenheit werden. Zuerst wirst du völlig vergessen, mit dem Hund rauszugehen. Er wird an der Haustür stehen und mit dem Kopf dagegen pochen, während deine Augen den Code verschlingen, den deine Finger in den Computer spielen.
Durch deine Nachlässigkeit wird es gefährlich. Die Berge ausgedruckten Codes werden die Lüftung zudecken. Dein Ofen wird ersticken. Der Müll wird sich auftürmen: Kartons eilig bestellter Pizzen und Werbung, um deren Entsorgung du dich nicht kümmern kannst. Du wirst verdrecken und die Luft verpesten. Moos wird die Wände überwuchern, das Wasser wird klumpig, Tiere werden einziehen, Bäume werden durch den Boden wachsen.
Aber dein Computer ist gut versorgt. Und du, Smothkkiss, wirst ihn mit deinem Wissen füttern. In den Äonen, die du mit deinem Rechner verbracht hast, wirst du zur Hälfte eine CPU sein. Und er wird halb Mensch sein. Deine Arme sind direkt an die Ports angeschlossen. Deine Augen werden die Ausgabe direkt vom DVI-24-Stecker bekommen. Deine Lungen sitzen über dem Prozessor, um ihn zu kühlen.
Und gerade als der Raum kurz davor ist, über dir zusammenzubrechen, weil die ganze Überwucherung dich und die Maschine verschluckt, wirst du dein Script fertig stellen. Du und deine Maschine werden dieses neueste Ruby-Script ausführen, ein Produkt deiner Obsession. Und das Script wird Kettensägen feuern, die die Bäume zu kappen, und Herde steuern, die dein Haus warmhalten. Nano-Bauroboter werden aus deinem Script strömen, um dein Quartier umzubauen; sie werden kacheln, renovieren, chromieren, polieren, desinfizieren. Mächtige Androiden werden dein bröckelndes Haus in starke, stabile Architektur verwandeln. Große Säulen und Statuen werden wachsen. Du wirst der Herr über diesen Palast sein und über die Berge und Inseln in der Umgebung deiner Festung.
Also ich denke, das passt schon. Was sagst du? Lass uns endlich mit diesem Script anfangen?
![[o]](i/chapter.poignant.guide-4.jpg)

I’ve never seen the ham do anything but leak juice. Today, our business in Ambrose Caverns is with the elf. He is a crucial part of the next lessons. Let’s all make him feel welcome. Go start warming up your listening hats! (And please change out of those ridiculous stirrup pants.)
A prompt warning: this lesson is much slower. Stay with it. This will be a long, deep breath. The most crucial stage of your instruction. It may seem like you’re not learning much code at first. You will be learning concepts. By the end of this chapter, you will know Ruby’s beauty. The coziness of the code will become a down sleeping bag for your own solace.
Alright, Elf. Give us a quick rundown of the currency issues you’ve faced there in your kingdom.

Yeah, that’s not the way I remember it. This Elf was paging me constantly. When I refused to call him back, he somehow left a message on my pager. Meaning: it beeped a couple times and then printed out a small slip of paper. The slip said something to the effect of, “Get down here quick!” and also, “We’ve got to rid the earth of this scourge of enterpreneurial caterpillars, these twisted insect vikings are suffocating my blue crystals!”
Lately, the exchange rate has settled down between leaves and crystals. One treegrown note is worth five crystals. So the basic money situation looks like this:
blue_crystal = 1
leaf_tender = 5This example is, like, totally last chapter. Still. It’s a start. We’re setting two variables. The equals sign is used for assignment.
Now leaf_tender represents the number 5 (as in: five blue crystals.) This concept right here is half of Ruby. We’re defining. We’re creating. This is half of the work. Assignment is the most basic form of defining.
You can’t complain though, can you Elf? You’ve built an empire from cashing your blue crystals into the new free market among the forest creatures. (And even though he’s an elf to us, he’s a tall monster to them.)

Nonono. Hang on a sec. You’re not ready for what the Elf here is doing in his caves. You’ll think it’s all positively inhumane, naughty, sick, tweeested, yada yada.
Back, back, way back before speedboats, I owned a prize race horse who took a stumble on the track. She did ten front flips and crashed into a guy who was carrying a full jar of mayonnaisse. We had blood and mayonnaisse up and down the track. Needless to say, she was a disaster.
The vet took one look at her and swore she’d never walk again. Her legs were gone and the vet wouldn’t allow a legless horse to just sit around. We’d need to put her down. He swore his life and career on it, insisting we divide into two parallel lines. The people who could not refute the doctor’s claims on one side; those too stubborn to accept his infallable medical reasoning on the other. The Elf, his pet ham, and I were the only ones in that second line.
So while the others heaped up trophies and great wreaths around the horse, bidding it a fond farewell before the bullet came to take him home, the Elf and I frantically pawed the Internet for answers. We took matter into our own hands, cauterizing her leg wounds with live crawdads. It worked great! We now had a horse again. Or at least: a horse body with a crustaceous abdominal frosting.
She scurried everywhere after that and lived for years in pleasantly moist underground cavities.
Animal Perfect is now the future of animal enhancement. They build new animals and salvage old-style animals for parts. Of course, they’ve come a long ways. When Animal Perfect started, you’d see a full-grown bear walk into Animal Perfect and you’d see a full-grown bear with sunglasses walk out. Completely cheesy.
Stick around and you’ll see a crab with his own jet pack. That’s a new 2004 model jetcrab.
But now, the whole operation is up and running. And the cleanliness of the place is astonishing. All the equipment is so shiny. Everything is in chrome. Oh, and all the staff have concealed weapons. They’re trained to kill anyone who enters unannounced. Or, if they run out of bullets, they’re trained to pistol whip anyone who enters unannounced.
Elf, make me a starmonkey.

Some imaginary Ruby for you:
pipe.catch_a_star
Variable pipe. Method catch_a_star. A lot of Rubyists like to think of methods as a message. Whatever comes before the dot is handed the message. The above code tells the pipe to catch_a_star.
This is the second half of Ruby. Putting things in motion. These things you define and create in the first half start to act in the second half.
So what if the star catching code works? Where does the star go?
captive_star = pipe.catch_a_star
See, it’s up to you to collect the miserable, little star. If you don’t, it’ll simply vanish. Whenever you use a method, you’ll always be given something back. You can ignore it or use it.
If you can learn to use the answers that methods give you back, then you will dominate.

Quickly then.
starmonkey = ratchet.attach( captive_monkey, captive_star )
The ratchet gets an attach message. What needs to be attached? The method arguments: the captive_monkey and the captive_star. We are given back a starmonkey, which we have decided to hang on to.

This is turning out to be such a short, little proggie that I’m just going to put it all together as one statement.
starmonkey = ratchet.attach( captive_monkey, pipe.catch_a_star ) + deco_hand_frog
See how pipe.catch_a_star is right in the arguments for the method? The caught star will get passed right to the ratchet. No need to find a place to put it. Just let it go.

The hotel here in Ambrose is no good at all. The beds are all lumpy. The elevator is tiny. One guy put all his bags in the elevator and found out there wasn’t room for him. He hit the button and chased up the stairs after it all. But the stairwell turned out to be too narrow and his shoulders got wedged going up.
The soap mini-bars they give you are sized down for elves, so it’s impossible to work up a lather. I hate it. I keep mistaking them for contact lenses.
I turned on the faucet and nothing came out. Thing is: Ambrose is a place with magical properties, so I took a chance. I put my hands under the spigot. Invisible, warm wetness. I felt the hurried sensation of running water, darting through my fingers. When I took my hands away, they were dry and clean.
It was an amazing nothingness to experience. It was just like nil.
In Ruby, nil represents an emptiness. It is without value. It isn’t zero. Zero is a number.
It’s Ruby’s own walking dead, a flatlined keyword. You can’t add to it, it doesn’t evolve. But it’s terribly popular. This skeleton’s smiling in all the pictures.
plastic_cup = nil
The above plastic_cup is empty. You could argue that the plastic_cup contains something, a nil. The nil represents the emptiness, though, so go ahead and call it empty.
Some of you who have programmed before will be tempted to say the plastic_cup is undefined. How about let’s not. When you say a variable is undefined, you’re saying that Ruby simply has no recollection of the variable, it doesn’t know the var, it’s absolutely non-existent.
But Ruby is aware of the plastic_cup. Ruby can easily look in the plastic_cup. It’s empty, but not undefined.

The cat Trady Blix. Frozen in emptiness. Immaculate whiskers rigid. Placid eyes of lake. Tail of warm icicle. Sponsored by a Very Powerful Pause Button.
The darkness surrounding Blix can be called negative space. Hang on to that phrase. Let it suggest that the emptiness has a negative connotation. In a similar way, nil has a slightly sour note that it whistles.
Generally speaking, everything in Ruby has a positive charge to it. This spark flows through strings, numbers, regexps, all of it. Only two keywords wear a shady cloak: nil and false draggin us down.
You can test that charge with an if keyword. It looks very much like the do blocks we saw in the last chapter, in that both end with an end.
if plastic_cup
print "Plastic cup is on the up 'n' up!"
endIf plastic_cup contains either nil or false, you won’t see anything print to the screen. They’re not on the if guest list. So if isn’t going to run any of the code it’s protecting.
But nil and false need not walk away in shame. They may be of questionable character, but unless runs a smaller establishment that caters to the bedraggled. The unless keyword has a policy of only allowing those with a negative charge in. Who are: nil and false.
unless plastic_cup
print "Plastic cup is on the down low."
endYou can also use if and unless at the end of a single line of code, if that’s all that is being protected.
print "Yeah, plastic cup is up again!" if plastic_cup
print "Hardly. It's down." unless plastic_cupAnd another nice trick: stack the if and unless.
print "We're using plastic 'cause we don't have glass." if plastic_cup unless glass_cupThis trick is a gorgeous way of expressing, Do this only if a is true and b isn’t true.
Now that you’ve met false, I’m sure you can see what’s on next.
approaching_guy = true
I saw true at the hotel buffet tables today. I cannot stand that guy. His stance is way too wide. And you’ve never met anyone who planted his feet so hard in the ground. He wears this corny necklace made out of shells. His face exudes this brash confidence. (You can tell he’s exerting all of his restraint just to keep from bursting into Neo flight.)
To be honest, I can’t be around someone who always has to be right. This true is always saying, “A-OK.” Flashing hang ten. And seriously, he loves that necklace. Wears it constantly.
As you’d suspect, he’s backstage at everything on the if event schedule.
print "Hugo Boss" if trueacts likeprint "Hugo Boss".
Occassionally, if will haul out the velvet ropes to exercise some crowd control. The double equals gives the appearance of a short link of ropes, right along the sides of a red carpet where only true can be admitted.
if approaching_guy == true
print "That necklace is classic."
endThe double equals is simply an ID check. Do the gentleman at both ends of this rope appear to match?
In this way, you control who if lets in. If you have a hard time getting along with true as I do, you can heartily welcome false.
if approaching_guy == false
print "Get in here, you conniving devil."
endSame goes for unless. The gateway is yours. Take possession of it.
Now, you want a head trip? The double equals sign is a method. Can you guess how it works? Here, check it out with the dot and parens:
approaching_guy.==( true )
Ruby allows the shortcut, though. You can drop the dot and back away slowly.
Now, do you remember what you need to do to dominate in Ruby? Use the answers the methods give you.
if nil.==( true )
print "This will never see realization."
endIn the above, how is the method’s answer being used?
Let’s take the statement nil == true. This will fail every time. No match. When there’s no match, the double equals method answers with false. A shake of the head. That answer is given to if, who can’t accept a false. The print never sees realization.
at_hotel = true
email = if at_hotel
"why@hotelambrose.com"
else
"why@drnhowardcham.com"
endEven though if isn’t a method, if does give a return answer. Look at the above and wonder over what happens when at_hotel is true.
The if will return the answer given by the code it chooses to run. In the case of at_hotel being true, the first string, my e-mail address at Hotel Ambrose, will be returned. The else keyword marks code which will run, should if fail. If at_hotel is false, the if will answer with my e-mail address at Dr. N. Howard Cham’s office, where I take my apprenticeship.
Should you have several lines of code in an if or unless, only the answer from the last full statement will be used.
email = if at_hotel
address = "why"
address << "@hotelambrose"
address << ".com"
endThree lines of code inside the if. The first line assigns a string with my name in it to a variable. The second and third lines add the rest of my e-mail address on to the end. The double less-than << is the concatenation operator. To concatenate is to append, or add to the end.
Just as we saw with the equality checker ==, the concatenator is a method. After adding to the end of the string, the concatenator also answers with that very string. So, the third line, which could be read as address.<<( ".com" ), gives back address, which the if then hands back for email’s assignment.
Here’s a question: what if the if fails? What if at_hotel is false in the above example? Is anything returned? Nothing is assigned to email, right?
Yes, nothing is returned. By which I mean: nil is returned. And often nil is a very useful answer.
print( if at_hotel.nil?
"No clue if he's in the hotel."
elsif at_hotel == true
"Definitely in."
elsif at_hotel == false
"He's out."
else
"The system is on the freee-itz."
end )You can use the nil? method on any value in Ruby. Again, think of it as a message. To the value: “Are you nil? Are you empty?”
If at_hotel is empty, Ruby doesn’t have any idea if I’m in the hotel or not. So if answers with the “No clue” string. In order to handle the true or false possibilities, the elsif keyword is used. While you can have only one if and one else, you can fill the inbetween with an exorbitant number of elsif keywords. Each elsif acts as a further if test. Checking for a positive charge.
If you’re doing okay at this point, then you’re in tip-top shape for the rest of the book. You have seen some pretty tough code in the last few examples. You strong fellow.

You finish reading the above comic and retire to your daybed for reflection. It’s one of those canopy affairs which is always logjammed with pillows. You sit atop the pile, gazing out upon the world. You see the tall smokestacks belching wide spools of fume and haze. The tangled concourses of freeways smattered with swift, shimmering traffic is but a gently pulsing eye muscle from your vantage point.
It is all so fantastic. How the colors of the horizon spread across the landscape as a great mix of butter and grease with a tablespoon of vanilla extract.
Yet, for all of the beauty which beckons for your attention, the images of the Elf and his Olympic Hopeful return. And more especially, that order for 55,000 starmonkeys. 55,000 starmonkeys, you think. Fifty-five Thousand.
You think of just the number itself. 55,000. It’s walking down a road. It might be in a forest, you don’t know for sure as your eyes are fixed right on the number itself. It’s stopping and talking to people. To tennis players, to a men’s choral group. There is merriment and good feeling. When it laughs, its lower zeros quiver with glee.
You want to talk to it. You want to skip along that forest trail with it. You want to climb aboard a jet bound to Brazil with it. And after five days and four nights at the leisureful Costa do Sauipe Marriott Resort & Spa, to marry it, to bear a family of 55,000 starmonkeys with it. To take possession of Nigeria with it.
With a flying leap, you dismount your pillow tower of isolation. Scrambling with the key, you unlock your roll top desk and pull out a sheet of paper, holding it firmly upon the desk. You begin scribbling.
Take possession of Nigeria with my new 55,000 starmonkeys… Over it, build Nigeria-sized vegetarians only casino and go-cart arena… Wings… we could have our own special sauce on the wings that’s different… Mustard + codeine = Smotchkkiss’ Starry Starmonkey Glow Sauce… Franchise, franchise… logos… Employee instructional videos… When you give the customer change, let them reach inside the frog on your hand to get it… If they have no change, at least put their reciept some place where they have to touch the frog… We’re leveling the playing field here… Advertise cheap pizza, let’s make our money off soda… Collect all 4 frosted glasses…
Wow, the ideas are really coming out. You literally had to smack yourself to stop. We need to put these in a safe place. Actually, we should store them on your computer and mangle the words. You look out the window and watch for FBI. I’m going to start this script.
print "Type and be diabolical: "
idea_backwards = gets.reverseLet this script be your confidante. It will ask for evil plans and turn their letters backwards. The gets method is built into Ruby. It’s a kernel method like print. This method gets will pause Ruby to let you type. When you hit Enter, gets will then stop paying attention to your keyboard punchings and answer back to Ruby with a string that contains everything you typed.
The reverse method is then used on the string that gets is giving back. The reverse method is part of the String class. Which means that anything which is a string has the reverse method available. More on classes in the next chapter, for now just know that a lot of methods are only available with certain types of values.
I don’t think reverse is going to cut it. The authorities only need to put a mirror to “airegiN fo noissessop ekaT.” Bust us when starmonkeys start to touch down in Lagos.
The capital letters give it away. Maybe if we uppercase all letters in the string before we reverse it.
idea_backwards = gets.upcase.reverseYou hand me a legal pad, doused in illegible shorthand. Scanning over it, I start to notice patterns. That you seem to use the same set of words repeatedly in your musings. Words like starmonkey, Nigeria, firebomb. Some phrases even. Put the kabosh on. That gets said a lot.
Let us disguise these foul terms, my brother. Let us obscure them from itching eyes that cry to know our delicate schemes and to thwart us from having great pleasure and many go-carts. We will replace them with the most innocent language. New words with secret meaning.
I start up a word list, a Ruby Hash, which contains these oft seen and dangerous words of yours. In the Hash, each dangerous word is matched up against a code word (or phrase). The code word will be swapped in for the real word.
code_words = {
'starmonkeys' => 'Phil and Pete, those prickly chancellors of the New Reich',
'catapult' => 'chucky go-go', 'firebomb' => 'Heat-Assisted Living',
'Nigeria' => "Ny and Jerry's Dry Cleaning (with Donuts)",
'Put the kabosh on' => 'Put the cable box on'
}The words which are placed before the arrow are called keys. The words after the arrows, the definitions, are often just called values.
Notice the double quotes around Ny and Jerry's Dry Cleaning (with Donuts). Since a single quote is being used an apostrophe, we can’t use single quotes around the string. (Although, you can use single quotes if you put a backslash before the apostrophe such as: 'Ny and Jerry\'s Dry Cleaning (with Donuts)'.)
Should you need to look up a specific word, you can do so by using the square brackets method.
code_words['catapult']will answer with the string'chucky go-go'.
Look at the square brackets as if they are a wooden pallet the word is sitting upon. A forklift could slide its prongs into each side of the pallet and bring it down from a shelf back in the warehouse. The word on the pallet is called the index. We are asking the forklift to find the index for us and bring back its corresponding value.
If you’ve never been to a warehouse, you could also look at the brackets as handles. Imagine an industrious worker putting on his work gloves and hefting the index back to your custody. If you’ve never used handles before, then I’m giving you about thirty seconds to find a handle and use it before I blow my lid.
As with many of the other operators you’ve seen recently, the index brackets are simply a shortcut for a method.
code_words.[]( 'catapult' )will answer with the string'chucky go-go'.
I went ahead and saved the Hash of code words to a file called wordlist.rb.
require 'wordlist'
# Get evil idea and swap in code words
print "Enter your new idea: "
idea = gets
code_words.each do |real, code|
idea.gsub!( real, code )
end
# Save the jibberish to a new file
print "File encoded. Please enter a name for this idea: "
idea_name = gets.strip
File::open( "idea-" + idea_name + ".txt", "w" ) do |f|
f << idea
endScript starts by pulling in our word list. Like gets and print, the require method is a kernel method, you can use it anywhere. I give it the string 'wordlist' and it will look for a file named wordlist.rb.
After that, there are two sections. I am marking these sections with comments, the lines that start with pound symbols. Comments are useful notes that accompany your code. Folks who come wandering through your code will appreciate the help. When going through your own code after some time has passed, comments will help you get back into your mindset. And there’s software out there that can take your comments and build documents from them. (RDoc and Ri—see Expansion Pak #1!)
I like comments because I can skim a big pile of code and spot the highlights.
As the comments tell us, the first section asks you for your evil idea and swaps in the new code words. The second section saves the encoded idea into a new text file.
code_words.each do |real, code|
idea.gsub!( real, code )
endYou see the each method? The each method is all over in Ruby. It’s available for Arrays, Hashes, even Strings. Here, our code_words dictionary is kept in a Hash. This each method will hurry through all the pairs of the Hash, one dangerous word matched with its code word, handing each pair to the gsub! method for the actual replacement.
In Ruby, gsub is short for global substitution. The method is used to search and replace. Here, we want to find all the occurences of a dangerous word and replace with its safe code word. With gsub, you provide the word to find as the first argument, then the word to put in its place as the second argument.
Why aren’t we hanging on to the answer from gsub? Doesn’t gsub give us an answer back that we should keep? You’d think the line would read:
safe_idea = idea.gsub( real, code )Yes, with gsub we’d need to hang on to its answer. We’re using a variation of gsub that is totally hyper. Notice the exclamation mark on the gsub! used inside the each block. The exclamation mark is a sign that gsub! is a bit of a zealot. See, gsub! will go ahead and replace the words in idea directly. When it’s done idea will contain the newly altered string and you won’t be able to find the old string.
Call gsub! a destructive method. It makes its changes