7
votes

Quelle est la manière la plus courte / la plus idiomatique de déterminer si une variable est l'une des valeurs de la liste?

Cela semble une question ridiculement simple à poser, mais quelle est la manière la plus courte / la plus idiomatique de réécrire cela dans RUBY?

if [:a, :b, :c, :d].select {|f| variable == f}.any?


3 commentaires

Je pense que la syntaxe "toute" semble assez propre. Mais, je suis C # et TT Sorta miroie comment Linq regarde, alors je suis biaisé.


Les documentations indiquent: tableau # include? Renvoie true si l'objet donné est présent en soi (c'est-à-dire si un objet == anoObject), faux sinon.


Je me demande si la mise en œuvre d'une isoneof? (Array) La méthode de la catégorie d'objet n'est pas considérée comme une bonne pratique dans Ruby, je veux dire, en train de jouer avec des classes de base (évidemment, je n'ai aucune expérience avec Ruby) ... Quoi qu'il en soit, ce serait bien si quelqu'un peut poster une telle méthode ....


5 Réponses :


1
votes

J'ai toujours utilisé votre deuxième exemple, si [: A,: B,: C,: D] .include? variable . Bien que cela présente des problèmes avec des classes qui écrivent == , c'est parfaitement bien dans la plupart des situations que j'en avais besoin (en vérifiant généralement des symboles).


2 commentaires

Merci pour vos commentaires. J'ai été mordu aujourd'hui par [: HTML,: XML] .Cluded? (Demande.Format) Rendez toujours de la fausse dans une application Rails, alors je pensais que je pourrais avoir besoin de me sortir de cette habitude!


Peut-être que vous pourriez écrire [: html,: xml] .include? (Demande.format.to_sym)



1
votes

Que diriez-vous:

 if [:a, :b, :c, :d].index variable


1 commentaires

Merci pour votre commentaire, c'est apprécié. Je pense que cela présente le même comportement que #include?, Mais - vraisemblablement pour la même raison, Pesto explique dans son commentaire.



0
votes

Qu'est-ce que vous faites vraiment, c'est voir si la variable est un membre de l'ensemble [: A,: B,: C,: D] SE SEMANTIELLISSON de la carte dans le Inclure? < / code> méthode.

Le problème que vous rencontrez est due à la nature de tape de canard de Ruby, donc si vous souhaitez contourner ce problème pourquoi ne pas convertir pour la première fois à un symbole: xxx


1 commentaires

Merci pour votre commentaire, c'est apprécié. Cela fonctionne dans beaucoup de cas, mais bien sûr, ne fonctionnera pas si l'objet en question implémente une logique supplémentaire dans sa définition de l'égalité. (Peut-être que cela se compare également à une liste de synonymes, par exemple.)



3
votes

On dirait que le tableau include? utilise == : xxx

le array # inclure? documentation explique également cela. >


1 commentaires

Merci pour votre analyse; C'est apprécié. J'étais duper par le problème du pesto observe ci-dessus, d'où ma confusion.



15
votes

En réalité, #include? code> est-ce que em> utilise == code>. Le problème découle du fait que si vous faites xxx pré>

il vérifie : a == foo code>, pas foo ==: A code>. C'est-à-dire qu'il utilise la méthode == code> définie sur les objets de la matrice, pas la variable. Par conséquent, vous pouvez l'utiliser tant que vous vous assurez que les objets de la matrice ont un == code> correct. P>

Dans les cas où cela ne fonctionnera pas, vous pouvez simplifier votre Déclaration en supprimant l'instruction code> SELECT CODE> et transmettez le bloc directement sur TOUT CODE>: P>

if [:a, :b, :c, :d].any? {|f| variable == f}


1 commentaires

Aha! Je pense que tu as cloué mon #include? Problème - Merci, ça fait un sens parfait. Retour au problème à la main, j'aime aussi votre méthode de transmission d'un bloc à tout? - Cela me semble très propre.