J'ai une variable contenant soit '&&' code> ou '' || ' code> et j'ai besoin de l'utiliser dans une instruction If si oui. operator = '&&'
result = 1===1 operator 2===2
#=> result = 1===1 && 2===2
3 Réponses :
L'opérateur Cependant, il y a deux manières: p> si vous voulez && code> est plus d'un élément de syntaxe de bas niveau que celui & code> et | code> qui sont des appels de méthode. Cela rend plus difficile à faire. && code> équivalence: p> [ a, b, c ].any?
# => true
[ a, b ].any?
# => true
[ b ].any?
# => false
Merci mais cela ne résout pas le problème. Le projet sur lequel je travaille implémente un utilisateur a généré une liste de conditions que je dois tester en fonction de l'opérateur sélectionné par l'utilisateur. Donc, la déclaration IF résultante peut contenir un mélange de && et ||
Cela résout le problème que vous avez décrit. Si vous avez un problème plus large, il convient de poser une nouvelle question à remédier à cette question, mais assurez-vous d'être précis sur la vraie portée de celui-ci.
Il était spécifique, comment utiliser une variable de chaîne en tant qu'opérateur, avec un exemple. J'apprécie votre réponse, mais dans ce cas, cela n'a pas résolu la question réellement posée. Pas besoin d'être salé.
Le déplacement de la pochette de but est toujours un mouvement branché. Votre question implique fortement qu'il existe un seul et un seul opérateur. Pour être sûr que tout le monde est sur la même page, essayez toujours d'exprimer des exigences plus en grande partie intégrantes, y compris des cas de bord qui doivent être couverts. Il est loin d'être clair où vous prenez cela et comment le tout? Code> ou tout? Code> approche décomposera.
Je n'ai pas bougé les poteaux de but, vous venez de prendre une hypothèse sur ce que je faisais ou pourquoi je le faisais plutôt que de regarder l'exemple et de répondre à la question. Mais tout est bon. J'ai eu la réponse et je suis sûr que votre réponse aidera quelqu'un à l'avenir. Pas besoin de le prendre si personnellement :) Encore une fois, merci pour votre réponse, je l'apprécie.
La réponse, espérons-le, n'est pas eval code>.
Vous pouvez le faire comme ceci:
if operator == '&&' 1===1 && 2===2 elsif operator == '||' 1===1 || 2===2 else # dunno end
J'espère que vous réalisez que cela vient avec un clignotant géant AVERTISSEMENT B>, comme EVAL code> vous expose à des niveaux de risque extraordinaires.
@Brad où est opérateur code> en provenance? La valeur de cette variable est-elle fournie par un utilisateur de votre application? Faites-vous confiance à cet utilisateur? Je demande parce que imaginez ce qui va arriver si opération code> était une chaîne comme ; Fileutils.remove_dir (...); code>?
@Lesightingillill: Ne faites pas d'évaluation, sauf si vous n'avez pas d'autre choix.
@tadman, @lespiningill: y a-t-il un moyen d'assurer avant eval code> que opérateur code>, A code> et B code> sont sûrs Pour le eval code>? C'est-à-dire, limiter la saisie de l'utilisateur au type "Safe".
Vous pouvez utiliser public_send, mais même s'il était autorisé avec &&, cela n'aurait pas de sens. Notez que Si vous souhaitez avoir cet effet, vous devez abandonner la court-circuitting, ce qui signifie que vous devez utiliser pour utiliser votre exemple pour la démonstration. p> Mise à jour forte>: Le commentaire de Tadman à ma réponse m'a fait Pensez que je devrais vous avertir du piège suivant: Basé sur votre question, j'ai supposé que les arguments que vous souhaitez connecter avec votre opérateur sont soit où E1 && E2 CODE> Shortcirits, en ce que E2 n'est pas évalué si E1 est déjà fausseté. Comment cela pourrait-il fonctionner avec public_send code>? & code> et | code> au lieu de && code> et || code>. Si vous insistez pour que votre variable opérateur code> contienne quelque chose comme '&&' code>, et pas, dites : & code> (ce qui aurait plus de sens), vous pourrait faire un p> true code> ou false code>. Dans ce cas, ma solution devrait bien fonctionner. Cependant, si vous ne pouvez être que tout réalité em> ou falsy em> valeur de certains classes x em>, vous devez les convertir en vrai < / em> ou faux em>, car sinon, l'opérateur peut avoir une interprétation différente (par exemple, si vous utilisez des opérandes d'être entier). Par conséquent, pour certains opértand_e1_ et E2 EM>, qui - comme la règle générale de Ruby - sont supposés être interprétés par SLA false s'il s'agit de faux code> ou nil code>, et est considéré comme vrai sinon, le moyen sûr de calculer votre résultat serait p> code> garantit que les expressions sont convertis en true code> et false code> de sorte que les opérateurs & code> et | code> peuvent être appliqués en toute sécurité. P> p>
& code> est très différent de && code>.
@tadman: En général, oui, mais dans la portée de la question des OPS, c'est la même chose, car il (1) ne veut pas avoir la fonction de court-circuit de &&, et (2) ses deux arguments sont Boolean i>, c'est-à-dire true code> ou false code>. Mais vous avez raison que le danger ici est caché, et je vais modifier ma réponse.
Je ne suis tout simplement pas sûr que cela fonctionnera du tout. Vous ne pouvez pas envoyer (: &&, ...) code> à quoi que ce soit.
@tadman: Vous ne pouvez pas, et je ne le fais pas. Je fais un Envoyer (: &, ...) code> à la place, lequel pour notre cas est suffisant, car nous n'avons pas besoin && code> ici.
Sauf que & code> est complètement différent de && code>.
@tadman: Non Complètement B>, comme je l'ai expliqué dans la mise à jour de ma réponse. a && x && (b = c) code> serait différent, tandis que (!! a) & (!) code> délivrerait le même résultat pour toute variable un code> et C code>. Les différences doivent être claires de ma réponse, et en particulier dans le champ d'application de la question, je ne vois aucune différence. En dehors de cela, j'aime bien votre suggestion de cartographier les chaînes de l'opérateur que l'OP veut utiliser, dans : tout? Code> ou : tout? Code> et appliquer ce symbole, mieux que Mon approche, mais les deux travaillent et c'est à la hauteur de choisir ce qui lui convient mieux.
Pourquoi avez-vous besoin de le faire de cette façon? Pendant que vous pouvez utiliser l'objet # Envoyer pour des méthodes, vous ne pouvez pas faire la même chose sans être évaluée pour les mots-clés et les opérateurs.
@Toddajacobs: vous pouvez faire publiquement sur presque tous les opérateurs (par exemple
2.Public_send (: +, 5) code> fonctionne bien), mais&& code> est une exception. Pour la même raison, vous ne pouvez pas le remplacer pour une classe.