Die vielen Verwendungsmöglichkeiten von Ruby Case-Anweisungen

Wenn Sie einige if / elsif-Anweisungen verwenden müssen, könnten Sie stattdessen eine Ruby Case-Anweisung verwenden. In diesem Beitrag lernen Sie ein paar verschiedene Anwendungsfälle kennen und erfahren, wie das Ganze unter der Haube funktioniert.

Ruby case

Hinweis: In anderen Programmiersprachen ist dies als switch-Anweisung bekannt.

Die Bestandteile einer case-Anweisung in Ruby:

Schlüsselwort Beschreibung
case Startet die Definition einer Case-Anweisung. Nimmt die Variable, mit der Sie arbeiten wollen.
when Jede Bedingung, die passen kann, ist eine when-Anweisung.
else Wenn nichts passt, dann tun Sie dies. Optional.

Ruby Case & Ranges

Die case-Anweisung ist flexibler, als es auf den ersten Blick erscheinen mag. Schauen wir uns ein Beispiel an, bei dem wir eine Nachricht ausgeben wollen, abhängig davon, in welchen Bereich ein Wert fällt.

case capacitywhen 0 "You ran out of gas."when 1..20 "The tank is almost empty. Quickly, find a gas station!"when 21..70 "You should be ok for now."when 71..100 "The tank is almost full."else "Error: capacity has an invalid value (#{capacity})"end

Ich denke, dieser Code ist ziemlich elegant im Vergleich zu dem, wie die if / elsif-Version aussehen würde.

Ruby Case & Regex

Sie können auch reguläre Ausdrücke als when Bedingung verwenden. Im folgenden Beispiel haben wir ein serial_code mit einem Anfangsbuchstaben, der uns sagt, wie riskant es ist, dieses Produkt zu konsumieren.

case serial_codewhen /\AC/ "Low risk"when /\AL/ "Medium risk"when /\AX/ "High risk"else "Unknown risk"end

Wann man Ruby Case nicht verwenden sollte

Wenn Sie eine einfache 1:1-Zuordnung haben, könnten Sie versucht sein, so etwas zu tun.

case countrywhen "europe" "http://eu.example.com"when "america" "http://us.example.com"end

Meiner Meinung nach wäre es besser, stattdessen dies zu tun:

SITES = { "europe" => "http://eu.example.com", "america" => "http://us.example.com"}SITES

Die Hash-Lösung ist effizienter und einfacher zu handhaben. Finden Sie nicht auch?

Wie case funktioniert: die ===-Methode

Sie fragen sich vielleicht, wie case unter der Haube funktioniert. Wenn wir zu unserem ersten Beispiel zurückgehen, passiert Folgendes:

(1..20) === capacity(21..70) === capacity(71..100) === capacity

Wie Sie sehen, ist die Bedingung umgekehrt, weil Ruby === auf dem Objekt auf der linken Seite aufruft. Das === ist nur eine Methode, die von jeder Klasse implementiert werden kann. In diesem Fall implementiert das Range diese Methode, indem es nur dann true zurückgibt, wenn der Wert innerhalb des Bereichs liegt.

So ist === in Rubinius implementiert (für die Klasse Range):

def ===(value) include?(value)end

Quelle: https://github.com/rubinius/rubinius/blob/master/core/range.rb#L178

Procs + Case

Eine weitere interessante Klasse, die === implementiert, ist die Klasse Proc.

Verwandter Beitrag: Erfahren Sie mehr über procs & lambdas.

In diesem Beispiel definiere ich zwei procs, eines, um auf eine even Zahl zu prüfen, und ein weiteres für odd.

odd = proc(&:odd?)even = proc(&:even?)case numberwhen odd puts "Odd number"when even puts "Even number"end

Das ist, was wirklich passiert:

odd.===(number)even.===(number)

Die Verwendung von === auf einem Proc hat den gleichen Effekt wie die Verwendung von call.

Abschluss

Sie haben gelernt, wie die case-Anweisung in Ruby funktioniert und wie flexibel sie sein kann. Jetzt sind Sie an der Reihe, es in Ihren eigenen Projekten optimal zu nutzen.

Ich hoffe, Sie haben diesen Artikel hilfreich gefunden!

Schreibe einen Kommentar

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