Bis zu diesem Punkt hast du also Rubys wichtigstes Konzept, EIAO, alles ist ein Objekt, kennengelernt. Ruby bietet sehr viel mehr an Wissenswertem. Eine relativ einfache Tatsache hast du schon kennengelernt: Mathematik. Wie jede ordentliche Programmiersprache kann natürlich auch Ruby Rechnungen mit allen möglichen (und unmöglichen sprich komplexen ;-) ) Zahlen machen. Oder Rückgabewerte von Ausdrücken. Oder Bedingungen. Lerne sie hier alle kennen!
irbAber zunächst möchten wir dich mit Rubys wichtigstem und bekanntestem Testwerkzeug bekannt machen: Der irb. Das Kürzel bedeutet interactive Ruby, also interaktives Ruby. Und genau das ist es auch. Mithilfe der irb kannst du Ruby-Code ausführen und sofort seinen Rückgabewert betrachten; dies ist eine sehr hilfreiche Eigenschaft und führt oft dazu, dass Fehler erkannt werden, die man nicht erwartet hätte. Man kann die irb aber auch einfach dazu benutzen, um »mal eben eine Annahme« zu überprüfen. Gib folgendes in eine Kommandozeile ein, um die irb zu starten:
Ist Ruby ordentlich installiert, wird eine irb-Sitzung (engl. Session) gestartet. Tippe ein paar mathematische Ausdrücke ein, um den Effekt zu sehen:
Deutlich sichtbar zeigt die irb dir jedesmal an, was der Code zurückgibt, den du Zeile für Zeile eingibst. Auch Klassen- und Methodendefinitionen schluckt die irb:
Nanu...? Was bedeutet denn dieser seltsame nil? nil ist ein spezielles Objekt in Ruby, denn es ist das Objekt, das nicht ist. Vereinfacht: nil meint nichts. Die Betonung liegt hierbei auf dem Wort meint, denn obwohl nil ein Platzhalter ist, der immer dann irgendwo steht, wenn kein Wert zugewiesen wurde, ist es nicht nichts. Der Beweis:
Schön, aber was macht es denn nun da? Da ist noch nirgends etwas, was eine Zuweisung benötigen würde? AusdrückeErstmal kommen wir auf den Begriff »valider Ruby-Ausdruck« zurück. Das Fremdwort »valide« ist schnell erklärt, denn ist gleichzusetzen mit »gültig«. Viel interessanter ist die inhaltliche Tatsache, dass jeder Ruby-Ausdruck etwas zurückgibt. Was auch immer du schreibst, es hat ein Ergebnis. Als Beweis sollte dir die irb genügen, denn sie zeigt dir von ausnahmslos jedem Ausdruck sein Ergebnis an. Obwohl du diese Tatsache vermutlich nicht oft benötigen wirst, ist es doch wichtig, sie zu kennen, denn in einigen Situationen kann der Rückgabewert eines Ausdrucks eine Operation völlig verändern. Deshalb sollte man sich immer bewusst sein, was die aktuelle Stelle im Code eigentlich bearbeitet und weitergibt! BedingungenJa, Bedingungen. Diese kleinen Biester sind das »Gehirn« eines Computers. Obwohl ein Computer nicht in der Lage ist »Was-Wäre-Wenn«-Beziehungen aufzubauen, so kann er doch im konkreten Fall eine Entscheidung treffen. Trifft etwas zu, kannst du ihn anweisen, den einen Weg zu gehen. Trifft es nicht zu, kannst du ihm auch mitteilen, dass er einen anderen gehen soll. In Ruby geschieht dies - wie in den meisten anderen Programmiersprachen auch - mithilfe des englischen Wortes für »Wenn«: if. Um so ein if möglichst akkurat zu machen, stehen dir diverse Möglichkeiten zur Verfügung:
Arbeiten wir dies doch einfach mal der Reihe nach ab: 1. Fall: Prüfung auf WahrheitsgehaltDu kannst einfach nur prüfen, ob etwas zutrifft/nicht zutrifft. Trifft etwas zu, ist es »wahr«, engl. true. Trifft es nicht zu, ist es »falsch«, engl. false. Diese beiden Werte, true und false, nennt man nach George Boole boolesche Konstanten (konstant, weil sie sich nie ändern. Wahr ist immer wahr und falsch immer falsch). Angewandt heißt das:
Du kannst ebenfalls prüfen, ob etwas nicht zutrifft. Dazu gibt es den logischen Operator not und seine (fast) gleichbedeutende Kurzform !:
2. Fall: Prüfung der Existenz eines ObjektesDu kannst die Existenz eines Objektes überprüfen. Diese Tatsache ist eng mit boolescher Logik verknüpft. Zunächst gilt es zu sagen, dass Ruby »wahr« und »falsch« als Objekte bereit stellt:
Diese Objekte führen bei Einsatz in einer Bedingung immer zum erwarten Ergebnis. Ein true lässt eine Bedingung immer gelingen, ein false immer fehlschlagen. Daneben gibt es in Ruby jedoch soetwas wie einen »indirekten Wahrheitsgehalt«. Dieses mehr oder minder konstruierte Wort beschreibt, wie sich Ruby-Objekte in Bedingungen verhalten. In einem Satz zusammengefasst: Alle Objekte außer false und nil gelten als wahr. . Dass falsch nicht wahr sein kann, ist klar. Warum »nichts« falsch ist, ist aber doch auch relativ einleuchtend, oder? Praktisch angewandt heißt das, dass wir anstatt vieler Prüfungen, ob ein Objekt existiert, einfach schreiben können:
Diese Tatsache wird im Umgang mit Instanzvariablen (darauf kommen wir bei der weiteren Besprechung von Klassen) wichtig. 3. Fall: MathematikDu kannst mathematische Vergleichsoperatoren benutzen. Der Satz ist relativ selbsterklärend. Betrachte folgendes Beispiel und bilde dir deine Meinung dazu:
Vorsicht ist jedoch bei der Prüfung auf Gleichheit geboten: Der Operator = bewirkt nämlich nur und ausschließlich Zuweisungen. Zum Testen auf exakte Äquivalenz musst du den Operator == benutzen. Mithilfe deines bisherigen Wissens kannst du dann doch bestimmt erklären, warum die erste dieser zwei if-Bedingungen nicht ausgeführt wird?
4. Fall: Und oder nicht?Du kannst mehrere Bedingungen mit »und« sowie »oder« verknüpfen. Die Operatoren and, or und not (diesen solltest du schon kennen) machen genau das, was man von ihnen erwartet:
Außerdem gibt es noch die Kurzformen && (und), || (oder) und ! (nicht; auch die kennst du schon). Sie gleichen den ausgeschrieben Wörtern in ihrer Bedeutung fast bis auf's Haar, aber eben nur fast. Für den Moment genügt es aber, sie als gleich anzusehen. 5. Fall: Und was, wenn nicht?Du kannst Alternativmöglichkeiten angeben. Und zwar mithilfe der Schlüsselwörter elsif und else. Jeder if-Block kann beliebig viele elsif-Klauseln beinhalten, aber nur eine else-Klausel. Er wird dann von oben abgearbeitet, eine Bedingung nach der anderen, und sobald eine zutrifft, der dazugehörige Codeblock ausgeführt. Trifft keine zu, tritt der else zugewiesene Block in Aktion.
Weitere BedingungenFür eine konkrete Fallunterscheidung einer bestimmten Variable ist zudem die case-Struktur praktisch. Sie ermöglicht es, ohne großen Tippaufwand viele verschiedene, aber ähnliche Fälle zu behandeln. Nehmen wir an, wir müssten verschiedenen Code ausführen, je nachdem, wie der Wert von x ist. Es wäre möglich dies langwierig mit if abzufragen:
Kompakter mit case:
Ist die Anweisung zudem nur eine Zeile lang, wird es richtig praktisch:
case benutzt aber den Vergleichsoperator === anstatt von ==. Dies führt gelegentlich zu fragwürdigen Ergebnissen, ist aber in der Regel ungefährlich. Wir werden darauf zu sprechen kommen, wenn wir die Core-Klassen von Ruby behandeln. TernäroperatorDiese kleine Struktur wurde aus C übernommen. Sie ermöglicht es, kurzen if..else-Code kurz und bündig in eine Zeile zu schreiben: meine_bedingung ? wenn_true_dann_das_hier : wenn_false_dann_das_hier Angewandt:
|
|||||||||||||||||||||||||||||||||||||||||||||