-1
votes

Comment faire des tentatives de chaîne entrées par l'utilisateur dans Ruby?

Je connais écrire comme xxx pré>

Il imprimera: la valeur d'A est 23 code>. p>

mais maintenant je reçois cela chaîne comme paramètre comme p> xxx pré>

méthode d'appel passe cette chaîne sous forme de paramètre p> xxx pré>

y a-t-il un moyen d'évaluer cette chaîne à l'intérieur de la méthode? met la chaîne code> doit interpoler la valeur A = 23. p>

EDIT: stry> p>

Je dois lire et exécuter le programme de Excel. P>

à la première ligne, P>

Saisie Excel est, P>

"the value of a is 23"  compare "the value of a is #{a}"


5 commentaires

Vous ne pouvez pas recevoir "la valeur d'A IS # {A}" sans avoir défini A précédemment, car cela poserait une exception NameError. Avez-vous vérifié cela?


Je peux recevoir cela comme une chaîne. Je lis la chaîne d'Excel et l'exécutant dans mon programme, donc je reçois la valeur d'A est # {A} comme chaîne, de sorte que cela ne lancerait aucune erreur.


FYI, si vous voulez faire exactement cela, vous devez autoriser l'exécution du code d'entrée utilisateur, qui introduirait un vecteur d'attaque d'injection. Voir ma réponse pour plus d'informations.


@Kache je l'ai détaillé maintenant dans ma question, pouvez-vous le renvoyer?


Je ne peux pas offrir des suggestions qui ne sont pas couverts ici .


4 Réponses :


1
votes

Vous pouvez créer un bloc, puis évaluer la chaîne: xxx


1 commentaires

non non! Cette chaîne la valeur d'A est # {A} est dynamique, pour un exemple, la prochaine fois que je peux recevoir quelque chose comme plan # {A} émis



1
votes

C'est une chose très étrange que vous essayez de faire. Lorsque vous avez une sorte de motif avec des espaces réservés, vous le faites comme: xxx

une interpolation de chaîne avec # {..} n'est pas destiné au cas que vous " Re décrivant comme la valeur est évaluée au moment de la construction de la chaîne, non plus tard. Vous pouvez faire une certaine correspondance de Regexp et remplacer le # {..} avec % {..} comme solution de contournement.


2 commentaires

Le format de noyau est tolérant à fournir plus de paramètres d'interpolation que la chaîne réellement, par exemple format "la valeur d'un% {b}", A: '23, B: 42 . J'ai du mal à comprendre ce que vous essayez d'accomplir.


Si ce n'est qu'une variable ou l'ordre des paramètres est identique à celui de la chaîne, alors Stackoverflow.com/a/62607973/ 1205724 est parfaitement bien.



1
votes

pour RUBY, vous pouvez modifier la manière dont vous "formatez" vos chaînes dans Excel, que vous pouvez utiliser "Classic" Formatage

dynamic_text = 'the value of the %s is %0.2f'

def evaluate(text, args)
  puts text % args
end

name = "Product"
price = 78.99
evaluate dynamic_text, [name, price]


6 commentaires

L'utilisateur donnera cette chaîne dans Excel 'La valeur d'A est% s' et ils définiraient également la valeur d'un Excel. J'ai écrit un code pour définir la valeur d'A à l'aide de instance_variable_set mais en utilisant votre code, il doit donner le nom de la variable à l'intérieur de la chaîne. Mais ce n'est pas le cas dans votre code.


L'utilisateur n'a pas besoin de donner un nom de variable, le nom de la variable peut être n'importe quoi. Avec des arguments nommés, il vous suffit de faire correspondre le hash donné à la méthode évaluer et les noms utilisés dans la chaîne dynamique.


@Rajagopalan, si les utilisateurs se définiront des valeurs dans Excel, il vous suffit de "convertir" des valeurs dans Excel vers le nom de hachage {valorisation: nom} et transmettez-le sur le Evaluate méthode


Nan. Il est difficile de vous expliquer. Mais merci pour vous essayer!


@Rajagopalan, pouvez-vous montrer comment vous obtenez des valeurs de l'Excel? Parce que si les utilisateurs définissent des valeurs dans Excel, ils doivent nommer que les valeurs sont en quelque sorte. S'ils mettent un nom pour la valeur, vous pouvez le convertir en hachage. S'ils mettent des valeurs sans noms, ils utilisent probablement une commande de valeurs comme moyen de reconnaître quelle valeur est ce. Dans ce cas, vous pouvez convertir des valeurs en une matrice et le transmettre à il évalue la méthode - et cela fonctionne


Votre réponse m'a vraiment aidé! Merci.



0
votes

Il y a quelques manières:

"Code" dynamique h1>

évaluation paresseuse avec lambdas: p> xxx pré>

Ceci est "Dynamique de code", mais Pas "Entrée dynamique", c'est-à-dire que vous ne pouvez pas recevoir le modèle de chaîne de l'utilisateur. p>

"entrée" dynamique 1 h1>

Templation ERB: P>

user_input_ruby_code = gets
puts user_input_ruby_code # '"Hello #{name}"'

name = gets # also user input, e.g. "World"

eval user_input_ruby_code # DANGER
# => "Hello World"


5 commentaires

Je dis "bla bla # {str}" est dynamique! Alors comment ça marche ça marche? oui c'est le code dynamique ~


Vous souhaitez recevoir un modèle de chaîne de l'utilisateur? Il y a plus d'une façon d'être dynamique, vous devriez clarifier.


Utilisateur d'abord la valeur de A, puis l'utilisateur donnera à la chaîne d'entrée dans l'Excel comme la valeur d'A est # {A} .


Mis à jour pour ajouter un exemple de "entrée" dynamique. Remarque: cette version nécessite une entrée de confiance de confiance.


Mis à jour la question maintenant.