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?
5 Réponses :
J'ai toujours utilisé votre deuxième exemple, si [: A,: B,: C,: D] .include? variable code>. Bien que cela présente des problèmes avec des classes qui écrivent
== code>, c'est parfaitement bien dans la plupart des situations que j'en avais besoin (en vérifiant généralement des symboles). P>
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) code>
Que diriez-vous:
if [:a, :b, :c, :d].index variable
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.
Qu'est-ce que vous faites vraiment, c'est voir si la variable est un membre de l'ensemble 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: p> [: A,: B,: C,: D] code> SE SEMANTIELLISSON de la carte dans le
Inclure? < / code> méthode.
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.)
On dirait que le tableau le include? code> utilise
== code>:
array # inclure? code>
documentation explique également cela. P> P> P> P> >
Merci pour votre analyse; C'est apprécié. J'étais duper par le problème du pesto observe ci-dessus, d'où ma confusion.
En réalité, il vérifie 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 #include? code> est-ce que em> utilise
== code>. Le problème découle du fait que si vous faites
: 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>
TOUT CODE>: P>
if [:a, :b, :c, :d].any? {|f| variable == f}
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.
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 ....