Verwenden der Case (Switch) Ruby-Anweisung

In den meisten Computersprachen ist der Fall oder die Bedingung (auch bekannt als Schalter) Anweisung vergleicht den Wert einer Variablen mit dem mehrerer Konstanten oder Literale und führt den ersten Pfad mit einem passenden Fall 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 Aussagen. Bei den Fällen handelt es sich technisch gesehen um Labels, und die switch-Anweisung wechselt zum passenden Label. Dies weist ein als "Fallthrough" bezeichnetes Verhalten auf, da die Ausführung nicht angehalten wird, wenn ein anderes Label erreicht wird.

Dies wird normalerweise durch die Verwendung 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 keinen Fallthrough, nur der erste Matching-Fall wird ausgeführt.

Die Grundform einer Fallbeschreibung

Die Grundform einer case-Anweisung lautet wie folgt.

Wie Sie sehen, ist dies so etwas wie eine if / else if / else-Bedingungsanweisung. Der Name (den wir den nennen werden) Wert), in diesem Fall von der Tastatur eingegeben, wird mit jedem der Fälle von der verglichen wann Klauseln (d. h. Fälle), und der erste, wenn Block mit einem passenden Fall ausgeführt wird. Wenn keiner von ihnen übereinstimmt, wird der sonst Block wird ausgeführt.

Was hier interessant ist, ist Wie Der Wert wird mit jedem der Fälle verglichen. Wie oben erwähnt, wird in C ++ und anderen C-ähnlichen Sprachen ein einfacher Wertevergleich verwendet. In Ruby wird der Gleichheitsoperator für Groß- und Kleinschreibung verwendet.

Denken Sie daran, dass der Typ der linken Seite eines Gleichheitsoperators wichtig ist und die Fälle immer die linke Seite sind. Also für jeden wann Klausel wird Ruby auswerten case === value bis es eine Übereinstimmung findet.

Wenn wir etwas eingeben würden Bob, Ruby würde zuerst auswerten "Alice" === "Bob", was wäre falsch da String # === ist definiert als der Vergleich der Zeichenketten. Nächster, /[qrz[.+/i === "Bob" ausgeführt werden würde, was seitdem 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 gebräuchliche Verwendung der case-Anweisung besteht darin, den Werttyp zu bestimmen und je nach Typ etwas anderes zu tun. Obwohl dies Rubys übliches Entenschreiben bricht, ist es manchmal notwendig, Dinge zu erledigen.

Dies funktioniert mit der Klasse # === (technisch gesehen die Modul # ===) Operator, der prüft, ob die rechte Seite ist ein? links.

Die Syntax ist einfach und elegant:

Eine andere mögliche Form

Wenn die Wert Wird diese weggelassen, funktioniert die case-Anweisung etwas anders: Sie funktioniert fast genauso wie eine if / else if / else-Anweisung. Die Vorteile der case-Anweisung gegenüber einer wenn Angaben sind in diesem Fall lediglich kosmetischer Natur.

Eine kompaktere Syntax

Es gibt Zeiten, in denen es viele kleine 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, zum des Körpers von zu setzen wann Klausel in der gleichen Zeile.

Während dies für einige sehr dichten Code sorgt, solange jeder wann Klausel ist sehr ähnlich, es wird tatsächlich Mehr lesbar.

Wenn Sie nach Belieben einzeilige und mehrzeilige Klauseln verwenden sollten, ist dies eine Frage des Stils. Es wird jedoch nicht empfohlen, beides zu mischen. Eine case-Anweisung sollte einem Muster folgen, das so gut wie möglich lesbar ist.

Fallzuordnung

Wie bei if-Anweisungen werden case-Anweisungen bis zur letzten Anweisung im ausgewertet 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. In einer solchen Tabelle müssen nicht unbedingt Literale verwendet werden wann Klauseln.

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