In den meisten Computersprachen, der Fall oder die Bedingung (auch bekannt als SchalterDie Anweisung) vergleicht den Wert einer Variablen mit dem mehrerer Konstanten oder Literale und führt den ersten Pfad mit einem übereinstimmenden Fall aus. Im RubinEs ist etwas flexibler (und leistungsfähiger).
Anstelle eines einfachen Gleichheitstests wird der Fallgleichheitsoperator verwendet, der die Tür für viele neue Verwendungszwecke öffnet.
Es gibt jedoch einige Unterschiede zu anderen Sprachen. Im C.Eine switch-Anweisung ist eine Art Ersatz für eine Reihe von wenn und gehe Aussagen. Die Fälle sind technisch Etiketten, und die switch-Anweisung wird zum passenden Etikett gehen. Dies zeigt ein Verhalten namens "Fallthrough", da die Ausführung nicht stoppt, wenn sie ein anderes Label erreicht.
Dies wird normalerweise mit einer break-Anweisung vermieden, aber manchmal ist ein Fallthrough beabsichtigt. Die case-Anweisung in Ruby hingegen kann als Abkürzung für eine Reihe von wenn Aussagen. Es gibt kein Durchfallen, nur der erste übereinstimmende Fall wird ausgeführt.
Die Grundform einer Fallbeschreibung
Die Grundform einer case-Anweisung lautet wie folgt.
Wie Sie sehen können, ist dies wie eine bedingte if / else if / else-Anweisung strukturiert. Der Name (den wir den nennen werden Wert), in diesem Fall über die Tastatur eingegeben, wird mit jedem der Fälle aus dem verglichen wann Klauseln (d.h. Fälle) und der erste When-Block mit einem passenden Fall wird ausgeführt. Wenn keiner von ihnen übereinstimmt, wird der sonst Block wird ausgeführt.
Was hier interessant ist, ist Wie Der Wert wird mit jedem Fall verglichen. Wie oben erwähnt, in C ++und anderen C-ähnlichen Sprachen wird ein einfacher Wertevergleich verwendet. In Ruby wird der Gleichheitsoperator verwendet.
Denken Sie daran, dass der Typ der linken Seite eines Operators für die Fallgleichheit wichtig ist und die Fälle immer die linke Seite sind. Also für jeden wann Klausel wird Ruby auswerten Fallwert bis es eine Übereinstimmung findet.
Wenn wir etwas eingeben würden BobRuby würde zuerst auswerten "Alice" "Bob", was da falsch wäre String # ist definiert als der Vergleich der Zeichenfolgen. Nächster, /[qrz‹.+/i "Bob" würde ausgeführt werden, was da falsch ist Bob beginnt nicht mit Q, R oder Z.
Da keiner der Fälle übereinstimmt, führt Ruby die else-Klausel aus.
Wie der Typ ins Spiel kommt
Eine häufige Verwendung der case-Anweisung besteht darin, den Werttyp zu bestimmen und je nach Typ etwas anderes zu tun. Obwohl dies Rubys übliche Ententypisierung bricht, ist es manchmal notwendig, Dinge zu erledigen.
Dies funktioniert mit der Klasse# (technisch gesehen die Modul#) Bediener, der prüft, ob die rechte Seite ist ein? links.
Die Syntax ist einfach und elegant:
Eine andere mögliche Form
Wenn die Wert Wenn dies weggelassen wird, funktioniert die case-Anweisung etwas anders: Sie funktioniert fast genau wie eine if / else if / else-Anweisung. Die Vorteile der Verwendung der case-Anweisung gegenüber einerwenn Aussage sind in diesem Fall nur kosmetisch.
Eine kompaktere Syntax
Es gibt Zeiten, in denen es eine große Anzahl kleiner gibt wann Klauseln. Eine solche case-Anweisung wird leicht zu groß, um auf den Bildschirm zu passen. Wenn dies der Fall ist (kein Wortspiel beabsichtigt), können Sie das verwenden dann Schlüsselwort, um den Körper des wann Klausel in der gleichen Zeile.
Dies führt zwar zu einem sehr dichten Code, solange jeder wann Klausel ist sehr ähnlich, es wird tatsächlich Mehr lesbar.
Wenn Sie einzeilig und mehrzeilig verwenden sollten, wenn Klauseln Ihnen überlassen sind, ist dies eine Frage des Stils. Es wird jedoch nicht empfohlen, beide zu mischen. Eine case-Anweisung sollte einem Muster folgen, um so gut wie möglich lesbar zu sein.
Fallzuordnung
Wie if-Anweisungen werden case-Anweisungen bis zur letzten Anweisung in der wann Klausel. Mit anderen Worten, sie können in Zuweisungen verwendet werden, um eine Art Tabelle bereitzustellen. Vergessen Sie jedoch nicht, dass case-Anweisungen viel leistungsfähiger sind als einfache Array- oder Hash-Lookups. Eine solche Tabelle muss nicht unbedingt Literale in der Tabelle verwenden wann Klauseln.
Wenn es keine übereinstimmende when-Klausel und keine else-Klausel gibt, wird die case-Anweisung als ausgewertet Null.