Computerwissenschaften

Verwendung der Case / Switch-Anweisung in Ruby

In den meisten Computersprachen vergleicht die case- oder bedingte Anweisung (auch als  switch bezeichnet. den Wert einer Variablen mit dem mehrerer Konstanten oder Literale und führt den ersten Pfad mit einem übereinstimmenden case aus. In Ruby ist es 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. In C ist eine switch-Anweisung eine Art Ersatz für eine Reihe von if- und goto- Anweisungen. Die Fälle sind technisch gesehen Labels, und die switch-Anweisung wird an das passende Label gesendet. 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 kann dagegen als Abkürzung für eine Reihe von if- Anweisungen angesehen werden. 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 so etwas wie eine if / else if / else-bedingte Anweisung strukturiert. Der Name (den wir den Wert nennen ), in diesem Fall über die Tastatur eingegeben, wird mit jedem der Fälle aus den when- Klauseln (dh  Fällen ) verglichen , und der erste when-Block mit einem übereinstimmenden Fall wird ausgeführt. Wenn keiner von ihnen übereinstimmt, wird der else- Block ausgeführt.

Interessant ist hier, wie der Wert mit jedem Fall verglichen wird. Wie oben erwähnt, wird in C ++ und anderen C-ähnlichen Sprachen 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. Daher wertet Ruby für jede when- Klausel den Wert case === aus, bis eine Übereinstimmung gefunden wird.

Wenn wir Bob eingeben würden, würde Ruby zuerst „Alice“ === „Bob“ auswerten , was falsch wäre, da String # === als Vergleich der Strings definiert ist. Als nächstes würde /[qrz‹.+/i === „Bob“ ausgeführt, was falsch ist, da Bob nicht mit Q, R oder Z beginnt.

Da keiner der Fälle übereinstimmt, führt Ruby die else-Klausel aus.

Wie der Typ ins Spiel kommt

Eine gebräuchliche 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 dem Operator Class # === (technisch gesehen der Modul # === ), der prüft, ob die rechte Seite_a ist. links.

Die Syntax ist einfach und elegant:

Eine andere mögliche Form

Wenn der Wert 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 über eine , wenn Aussage, in diesem Fall sind lediglich kosmetischer Natur.

Eine kompaktere Syntax

Es gibt Zeiten, in denen es eine große Anzahl kleiner when- Klauseln gibt. 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 Schlüsselwort then verwenden , um den Hauptteil der when- Klausel in dieselbe Zeile zu setzen.

Während dies für einige sehr dichten Code macht, solange jeder , wenn Klausel sehr ähnlich ist, wird es 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 when- Klausel ausgewertet . 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 den when- Klauseln verwenden.

Wenn es keine übereinstimmende when-Klausel und keine else-Klausel gibt, wird die case-Anweisung mit nil ausgewertet .

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.