Ruby utilise plutôt l' case
expression .
case x
when 1..5
"It's between 1 and 5"
when 6
"It's 6"
when "foo", "bar"
"It's either foo or bar"
when String
"You passed a string"
else
"You gave me #{x} -- I have no idea what to do with that."
end
Ruby compare l'objet dans la when
clause avec l'objet dans la case
clause à l'aide de l' ===
opérateur. Par exemple, 1..5 === x
et non x === 1..5
.
Cela permet des when
clauses comme vu ci-dessus. Les plages, les classes et toutes sortes de choses peuvent être testées plutôt que simplement l'égalité.
Contrairement aux switch
instructions dans de nombreuses autres langues, Ruby case
n'a pas d' interruption , il n'est donc pas nécessaire de terminer chacune when
par un break
. Vous pouvez également spécifier plusieurs correspondances dans une seule when
clause comme when "foo", "bar"
.
when
etreturn
sur la même ligne:when "foo" then "bar"
switch
instructions dans de nombreuses autres langues, Rubycase
n'a PAS de raccourci , il n'est donc pas nécessaire de terminer chacunewhen
par unbreak
.then
. Veuillez également consulter les autres réponses.case...when
se comporte un peu de manière inattendue lors de la gestion des classes. Cela est dû au fait qu'il utilise l'===
opérateur.Cet opérateur fonctionne comme prévu avec les littéraux, mais pas avec les classes:
Cela signifie que si vous souhaitez effectuer une opération
case ... when
sur une classe d'objet, cela ne fonctionnera pas:Imprime "Ce n'est pas une chaîne ou un nombre".
Heureusement, cela est facilement résolu. L'
===
opérateur a été défini de sorte qu'il renvoietrue
si vous l'utilisez avec une classe et fournissez une instance de cette classe comme deuxième opérande:En bref, le code ci-dessus peut être corrigé en supprimant
.class
:J'ai rencontré ce problème aujourd'hui en cherchant une réponse, et c'était la première page qui apparaissait, alors j'ai pensé que cela serait utile à d'autres dans ma même situation.
la source
.class
est intéressant de noter que le rôle est joué, merci. Bien sûr, c'est un comportement tout à fait approprié (bien que je puisse voir comment ce pourrait être une erreur courante de penser que cela s'imprimeraitIt is a string
) ... vous testez la classe d'un objet arbitraire, pas l'objet lui-même. Ainsi, par exemple: lescase 'hello'.class when String then "String!" when Class then "Class!" else "Something else" end
résultats dans:"Class!"
Cela fonctionne même pour1.class
,{}.class
etc. Dropping.class
, nous obtenons"String!"
ou"Something else"
pour ces différentes valeurs.Cela se fait en utilisant
case
Ruby. Voir également la « déclaration Switch » sur Wikipédia.Cité:
Un autre exemple:
Sur la page 123 de The Ruby Programming Language (1st Edition, O'Reilly) sur mon Kindle, il est indiqué que le
then
mot - clé suivant leswhen
clauses peut être remplacé par une nouvelle ligne ou un point-virgule (comme dans laif then else
syntaxe). (Ruby 1.8 autorise également les deux points à la place dethen
, mais cette syntaxe n'est plus autorisée dans Ruby 1.9.)la source
when (-1.0/0.0)..-1 then "Epic fail"
type = #{score}
chaque ligne, je peux simplement copier ce que vous avez fait. Beaucoup plus élégant j'aime aussi beaucoup mieux les one-liners (si possible)cas ... quand
Pour ajouter plus d'exemples à la réponse de Chuck :
Avec paramètre:
Sans paramètre:
S'il vous plaît, soyez conscient de " Comment écrire une instruction switch en Ruby " que kikito met en garde.
la source
or
De nombreux langages de programmation, en particulier ceux dérivés de C, prennent en charge le soi-disant Switch Fallthrough . Je cherchais la meilleure façon de faire de même dans Ruby et j'ai pensé que cela pourrait être utile aux autres:
Dans les langages de type C, la chute ressemble généralement à ceci:
Dans Ruby, la même chose peut être obtenue de la manière suivante:
Ce n'est pas strictement équivalent, car il n'est pas possible de laisser
'a'
exécuter un bloc de code avant de passer à'b'
ou'c'
, mais pour la plupart je le trouve assez similaire pour être utile de la même manière.la source
Dans Ruby 2.0, vous pouvez également utiliser des lambdas dans les
case
instructions, comme suit:Vous pouvez également créer facilement vos propres comparateurs à l'aide d'un Struct avec une personnalisation
===
(Exemple tiré de "Les procs peuvent-ils être utilisés avec des instructions case dans Ruby 2.0? ".)
Ou, avec une classe complète:
(Exemple tiré de " Comment fonctionne une déclaration Ruby Case et ce que vous pouvez en faire ".)
la source
Vous pouvez utiliser des expressions régulières, telles que rechercher un type de chaîne:
Ruby's
case
utilisera l'opérande d'égalité===
pour cela (merci @ JimDeville). Des informations supplémentaires sont disponibles sur " Opérateurs Ruby ". Cela peut également être fait en utilisant l'exemple @mmdemirbas (sans paramètre), seule cette approche est plus propre pour ces types de cas.la source
Si vous êtes impatient de savoir comment utiliser une condition OU dans un boîtier de commutateur Ruby:
Ainsi, dans une
case
déclaration, a,
est l'équivalent de||
dans uneif
déclaration.Voir " Fonctionnement d'une déclaration Ruby Case et ce que vous pouvez en faire ".
la source
Il s'appelle
case
et il fonctionne comme vous vous en doutez, en plus de beaucoup de choses amusantes grâce===
auxquelles les tests sont mis en œuvre.Maintenant, pour le plaisir:
Et il s'avère que vous pouvez également remplacer une chaîne if / else arbitraire (c'est-à-dire, même si les tests n'impliquent pas une variable commune)
case
en omettant lecase
paramètre initial et en écrivant simplement des expressions où la première correspondance correspond à ce que vous voulez.la source
Ruby utilise le
case
pour écrire des instructions switch.Selon la
case
documentation:Exemple:
Version plus courte:
Et comme " l'énoncé de cas de Ruby - techniques avancées " décrit Ruby
case
;Peut être utilisé avec des gammes :
Peut être utilisé avec Regex :
Peut être utilisé avec Procs et Lambdas :
Peut également être utilisé avec vos propres classes de correspondance:
la source
Selon votre cas, vous pourriez préférer utiliser un hachage de méthodes.
S'il y a une longue liste de
when
s et que chacun d'eux a une valeur concrète à comparer (pas un intervalle), il sera plus efficace de déclarer un hachage de méthodes puis d'appeler la méthode appropriée à partir du hachage comme ça.la source
Puisque
switch case
renvoie toujours un seul objet, nous pouvons directement imprimer son résultat:la source
Cas à valeurs multiples et sans valeur:
Et une solution d' expression régulière ici:
la source
case some_string, when /\d/, (stuff), when /[a-zA-Z]/, (stuff), end
(où,
signifieVous pouvez écrire des
case
expressions de deux manières différentes dans Ruby:if
déclarationscase
et chaquewhen
clause est comparée à la cible.ou:
la source
Vous pouvez faire ça de façon plus naturelle,
la source
Beaucoup de bonnes réponses mais je pensais que j'ajouterais un factoïde .. Si vous essayez de comparer des objets (classes) assurez-vous que vous avez une méthode de vaisseau spatial (pas une blague) ou comprenez comment ils sont comparés
" Ruby Equality And Object Comparison " est une bonne discussion sur le sujet.
la source
<=>
est utilisée pour renvoyer -1, 0, 1 ou zéro selon que la comparaison renvoie respectivement moins que, égal, supérieur ou non comparable. La documentation du module Comparable de Ruby l' explique.Comme indiqué dans la plupart des réponses ci-dessus, l'
===
opérateur est utilisé sous le capot surcase
/when
instructions.Voici des informations supplémentaires sur cet opérateur:
Opérateur d'égalité de cas:
===
De nombreuses classes intégrées de Ruby, telles que String, Range et Regexp, fournissent leurs propres implémentations de l'
===
opérateur, également appelées «égalité de casse», «triple égal» ou «trois quals». Parce qu'il est implémenté différemment dans chaque classe, il se comportera différemment selon le type d'objet auquel il a été appelé. En général, elle renvoie vrai si l'objet de droite "appartient à" ou "est membre de" l'objet de gauche. Par exemple, il peut être utilisé pour tester si un objet est une instance d'une classe (ou l'une de ses sous-classes).Le même résultat peut être obtenu avec d'autres méthodes qui sont probablement les mieux adaptées au travail, telles que
is_a?
etinstance_of?
.Mise en œuvre de la gamme
===
Lorsque l'
===
opérateur est appelé sur un objet de plage, il renvoie vrai si la valeur de droite se situe dans la plage de gauche.N'oubliez pas que l'
===
opérateur appelle la===
méthode de l'objet de gauche.(1..4) === 3
Est donc équivalent à(1..4).=== 3
. En d'autres termes, la classe de l'opérande de gauche définira quelle implémentation de la===
méthode sera appelée, de sorte que les positions des opérandes ne sont pas interchangeables.Regexp Implementation of
===
Renvoie true si la chaîne de droite correspond à l'expression régulière de gauche.
La seule différence pertinente entre les deux exemples ci-dessus est que, en cas de correspondance,
===
renvoie true et=~
renvoie un entier, qui est une valeur véridique dans Ruby. Nous y reviendrons bientôt.la source
la source
Voir " Ruby - si ... sinon, cas, sauf " pour plus d'informations.
la source
J'ai commencé à utiliser:
Il aide à compacter du code dans certains cas.
la source
Hash
, plutôt que d'unecase
instruction.Pas de prise en charge des expressions régulières dans votre environnement? Par exemple, Shopify Script Editor (avril 2018):
Une solution de contournement suivant une combinaison de méthodes déjà décrites précédemment ici et ici :
J'ai utilisé
or
s dans l'instruction de méthode de classe depuis||
a une priorité plus élevée que.include?
. Si vous êtes un rubis-nazi , imaginez s'il vous plaît que j'ai utilisé cela à la(item.include? 'A') || ...
place. test repl.it.la source
Il est essentiel de souligner la virgule (
,
) dans unewhen
clause. Il agit comme||
d'uneif
déclaration, qui est, il fait un OU comparaison et non une ET comparaison entre les expressions délimitées de lawhen
clause. Voir l'énoncé de cas suivant:x
n'est pas inférieur à 2, mais la valeur de retour est"apple"
. Pourquoi? Parce quex
c'était 3 et depuis',`` acts as an
||, it did not bother to evaluate the expression
x <2 '.Vous pourriez penser que pour effectuer un ET , vous pouvez faire quelque chose comme ceci ci-dessous, mais cela ne fonctionne pas:
Cela ne fonctionne pas, car
(3 && x > 2)
il a la valeur true, et Ruby prend la valeur True et la compare àx
avec===
, ce qui n'est pas vrai, car ellex
vaut 3.Pour faire une
&&
comparaison, vous devrez traitercase
comme un blocif
/else
:Dans le livre Ruby Programming Language, Matz dit que cette dernière forme est la forme simple (et rarement utilisée), qui n'est rien d'autre qu'une syntaxe alternative pour
if
/elsif
/else
. Cependant, qu'il soit rarement utilisé ou non, je ne vois pas d'autre moyen d'attacher plusieurs&&
expressions pour une donnéewhen
clause .la source
if...elsif
? Il semble que vous essayez de mélanger une déclaration de cas et une condition. Pourquoi? Mettez simplement le conditionnel dans le bloc when, par exemple.when 3; ( x < 2 ) ? 'apple' : 'orange'
Nous pouvons écrire une instruction switch pour plusieurs conditions.
Par exemple,
la source
case
,when
,end
) Sont sensibles à la casse et ne peuvent pas être en majuscules comme celui - ci.NoMethodError (undefined method
CASE 'pour main: Object) `. Comme l'a dit @ sondra.kinsey, vous ne pouvez pas utiliser de majuscules. Ruby pensera que c'est une constante.L'
case
opérateur de déclaration est commeswitch
dans les autres langues.Voici la syntaxe de
switch...case
en C:Voici la syntaxe de
case...when
Ruby:Par exemple:
Pour plus d'informations, consultez la
case
documentation.la source