De vele toepassingen van Ruby Case Statements

Wanneer je een aantal if / elsif statements moet gebruiken, zou je kunnen overwegen om in plaats daarvan een Ruby case statement te gebruiken. In deze post leer je een paar verschillende use cases en hoe het allemaal echt werkt onder de motorkap.

ruby case

Opmerking: In andere programmeertalen staat dit bekend als een switch statement.

De onderdelen van een case-statement in Ruby:

Keyword Description
case Start een case-statementdefinitie. Neemt de variabele waarmee je gaat werken.
when Elke voorwaarde waaraan kan worden voldaan is een when statement.
else Als er niets overeenkomt doe dan dit. Optioneel.

Ruby Case & Bereiken

Het case statement is flexibeler dan het op het eerste gezicht lijkt. Laten we eens een voorbeeld bekijken waarbij we een bericht willen afdrukken afhankelijk van in welk bereik een waarde valt.

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

Ik denk dat deze code vrij elegant is vergeleken met hoe de if / elsif versie eruit zou zien.

Ruby Case & Regex

Je kunt ook reguliere expressies gebruiken als je when voorwaarde. In het volgende voorbeeld hebben we een serial_code met een beginletter die ons vertelt hoe riskant dit product is om te consumeren.

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

Wanneer geen Ruby Case gebruiken

Wanneer je een eenvoudige 1:1 mapping hebt, zou je in de verleiding kunnen komen om iets als dit te doen.

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

In mijn ogen zou het beter zijn om in plaats daarvan dit te doen:

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

De hash-oplossing is efficiënter en gemakkelijker om mee te werken. Vindt u ook niet?

Hoe de zaak werkt: de === methode

U vraagt zich misschien af hoe case onder de motorkap werkt. Als we teruggaan naar ons eerste voorbeeld, is dit wat er gebeurt:

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

Zoals u kunt zien, is de voorwaarde omgekeerd omdat Ruby === aanroept op het object aan de linkerkant. De === is gewoon een methode die door elke klasse kan worden geïmplementeerd. In dit geval implementeert Range deze methode door alleen true terug te geven als de waarde binnen het bereik wordt gevonden.

Dit is hoe === in Rubinius is geïmplementeerd (voor de Range klasse):

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

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

Procs + Case

Een andere interessante klasse die === implementeert is de Proc klasse.

Verwante post: Leer meer over procs & lambdas.

In dit voorbeeld definieer ik twee procs, een om te controleren op een even getal, en een ander voor odd.

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

Dit is wat er werkelijk gebeurt:

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

Het gebruik van === op een proc heeft hetzelfde effect als het gebruik van call.

Conclusie

Je hebt geleerd hoe het Ruby case statement werkt en hoe flexibel het kan zijn. Nu is het uw beurt om er optimaal gebruik van te gaan maken in uw eigen projecten.

Ik hoop dat u dit artikel nuttig vond!

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *