7
votes

La déclaration de cas rubis court à l'aide comprend? Ne fonctionnera pas

J'ai le code suivant avec un petit bogue, l'instruction de cas renvoie la valeur "Autre" Même si la première instruction "Quand" évalue le vrai et devrait renvoyer "Bateaux".

J'ai cherché À cela depuis des siècles, doit être quelque chose de petit. xxx

merci!


1 commentaires

Il n'y a pas de : voitures étiquette dans votre hachage. Il est donc impossible de retourner "bateaux"


3 Réponses :


7
votes

(Je vais ignorer le fait que votre hachage ne contient aucune des touches que vous vérifiez et prétendez que vous vérifiez que vous vérifiez les clés qui sont réellement dans le hachage. J'espère que c'est le droit hypothèse.)

Vous semblez mal comprendre ce que l'instruction est. Il teste la valeur de l'objet de la déclaration , pas simplement en cours d'exécution d'un groupe de vaguement associé si s. Le quand -Clauses sont tous comparés à === à l'objet de la déclaration instruction "/ code>. Donc, si vous écrivez Catégorie_classes [: Bateaux] .Cluded? (Catégorie_ID) , puis signifie que si true === catégorie_id ou si faux === catégorie_id (puisque inclure? renvoie true ou false).

Ce que vous voulez, c'est plus comme Catégories.Find {| K, V | v.include? catégorie_id} .first.to_s .


1 commentaires

En réalité, la déclaration de cas rubis a deux formes et l'une des choses est en effet destinée à courir un tas d'IFs vaguement liés. Il avait probablement l'intention d'utiliser l'autre cas de cas, que vous obtenez en suivant le cas directement avec A quand.



11
votes

A Case est généralement juste un raccourci pour un si instruction. Vous pouvez être réécrit comme suit: xxx

Lorsque vous le regardez dans ce formulaire, vous devriez voir le problème clairement; tandis que inclure? renvoie un booléen, vous comparez la valeur entière.


2 commentaires

En réalité case utilise === , pas == , mais dans ce cas, la différence n'a pas d'importance.


@ Sepp2k mon mauvais, c'est ce que je voulais écrire.



51
votes

Vous pouvez développer une matrice dans lorsque la déclaration comme suit: xxx


3 commentaires

L'opérateur de splat est Hawt, bien que cela puisse finir par être moins efficace qu'une déclaration IF.


Je préfère cette belle syntaxe à la réponse acceptée. Aussi concernant @Mikej Commenter Un repère serait bien.


Décidé de faire une référence pour cela. apparemment à l'aide de cas d'expansion du tableau est de 1,5 fois plus lent (testé sur Ruby 2.7.2P137 (2020-10 -01 Révision 5445E04352) [x86_64-Linux] )