In de meeste computertalen is de zaak of voorwaardelijk (ook bekend als schakelaar) statement vergelijkt de waarde van een variabele met die van verschillende constanten of literalen en voert het eerste pad uit met een bijpassend geval. In Ruby is het een beetje flexibeler (en krachtiger).
In plaats van dat er een eenvoudige gelijkheidstest wordt uitgevoerd, wordt de operator voor case-gelijkheid gebruikt, waardoor er veel nieuwe toepassingen mogelijk zijn.
Er zijn echter enkele verschillen met andere talen. In C is een schakeloptie een soort vervanging voor een reeks als en ga naar statements. De cases zijn technisch labels en de schakeloptie gaat naar het overeenkomende label. Dit vertoont een gedrag dat "doorval" wordt genoemd, omdat de uitvoering niet stopt wanneer het een ander label bereikt.
Dit wordt meestal vermeden met behulp van een break-statement, maar doorval is soms opzettelijk. De casusverklaring in Ruby kan daarentegen worden gezien als een afkorting voor een reeks van als statements. Er is geen doorval, alleen de eerste matching case wordt uitgevoerd.
De basisvorm van een casusverklaring is als volgt.
Zoals u kunt zien, is dit gestructureerd zoiets als een voorwaardelijke statement if / else if / else. De naam (die we de waarde), in dit geval ingevoerd vanaf het toetsenbord, wordt vergeleken met elk van de gevallen uit de wanneer clausules (d.w.z.. gevallen), en de eerste wanneer een blok met een bijpassende case wordt uitgevoerd. Als geen van beide overeenkomt, wordt de anders blok wordt uitgevoerd.
Wat hier interessant is, is hoe de waarde wordt vergeleken met elk van de gevallen. Zoals hierboven vermeld, wordt in C ++ en andere C-achtige talen een eenvoudige waardevergelijking gebruikt. In Ruby wordt de operator voor case-gelijkheid gebruikt.
Onthoud dat het type linkerkant van een operator voor casusgelijkheid belangrijk is en dat de cases altijd aan de linkerkant zijn. Dus voor elk wanneer clausule, Ruby zal evalueren case === waarde totdat het een overeenkomst vindt.
Als we zouden invoeren Bob, Ruby zou eerst evalueren "Alice" === "Bob", wat sindsdien onwaar zou zijn String # === wordt gedefinieerd als de vergelijking van de tekenreeksen. De volgende, / cialisqrzemoet.+/i === "Bob" zou worden uitgevoerd, wat sindsdien onjuist is Bob begint niet met Q, R of Z.
Omdat geen van de gevallen overeenkwam, zal Ruby dan de else-clausule uitvoeren.
Een veel voorkomend gebruik van de case-instructie is om het type waarde te bepalen en iets anders te doen, afhankelijk van het type. Hoewel dit Ruby's gebruikelijke eendtypen breekt, is het soms noodzakelijk om dingen voor elkaar te krijgen.
Dit werkt met behulp van de Class # === (technisch gezien de Module # ===) operator, die test of de rechterkant is een? linkerkant.
De syntaxis is eenvoudig en elegant:
Als de waarde wordt weggelaten, werkt de case-instructie een beetje anders: het werkt bijna precies als een if / else if / else-instructie. De voordelen van het gebruik van de case statement ten opzichte van een als bewering is in dit geval louter cosmetisch.
Er zijn momenten waarop er een groot aantal kleine wanneer clausules. Zo'n case-statement wordt gemakkelijk te groot om op het scherm te passen. Wanneer dit het geval is (geen bedoelde woordspeling), kunt u de vervolgens trefwoord om het lichaam van de wanneer clausule op dezelfde regel.
Terwijl dit zorgt voor een aantal zeer dichte code, zolang elk wanneer clausule is zeer vergelijkbaar, het wordt eigenlijk meer leesbaar.
Wanneer u single-line en multi-line moet gebruiken wanneer clausules aan u zijn, is het een kwestie van stijl. Het is echter niet aan te raden om de twee te mixen - een case-statement moet een patroon volgen om zo leesbaar mogelijk te zijn.
Net als uitspraken, worden case-statements geëvalueerd tot de laatste statement in de wanneer clausule. Met andere woorden, ze kunnen in opdrachten worden gebruikt om een soort tabel te bieden. Vergeet echter niet dat case-statements veel krachtiger zijn dan eenvoudige array- of hash-zoekopdrachten. Zo'n tabel hoeft niet noodzakelijkerwijs letterlijk te gebruiken in de wanneer clausules.
Als er geen overeenkomende clausule is en geen andere clausule, wordt de case-statement geëvalueerd als nul.