2010-03-27 9 views
18

Je commence tout juste à apprendre Ruby et j'ai écrit un programme qui génère des nombres et les affecte aux variables @one, @two, @three etc. L'utilisateur peut alors spécifier une variable à modifier en entrant son nom (par exemple un). Je dois ensuite faire quelque chose comme '@ [valueofinout] = asd'. Comment est-ce que je ferais ceci, et est-ce qu'il y a une meilleure manière comme ma façon de penser semble être découragée? J'ai trouvéUtiliser la valeur d'une variable comme nom d'une autre variable dans Ruby

x = "myvar" 
myvar = "hi" 
eval(x) -> "hi" 

mais je ne comprends pas complètement pourquoi la deuxième ligne est nécessaire. Dans mon cas, devrais-je utiliser quelque chose comme

@one = "21" 
input = "one" 
input = "@" + input 
changeto = "22" 
eval(input) -> changeto 

Répondre

28

utilisation instance_variable_set (rubydoc)

instance_variable_set("@" + varname, value) 

Dans la plupart des cas cependant, vous devez séparer vos normales des variables Ruby à partir des variables de votre utilisateur interagit avec. Que diriez-vous de créer un hachage de variables utilisateur, par ex.

@uservars = { 'one' => 1, 'two' => 2 } 
two = @uservars['two'] # Look up 'two' variable 

varname = "myvar" 
@uservars[varname] = 5 # Set a variable by name 
value = @uservars[varname] # Get a variable by name 
+1

wow, c'est en fait un domaine où PHP domine ruby ​​en termes de propreté de la syntaxe. http://stackoverflow.com/a/4169891/2951835 – ahnbizcad

+0

Ruby est difficile à faire parce que c'est moche, vous avez rarement besoin de définir une variable spécifiée par l'utilisateur d'une instance, sauf si vous êtes en train de métaprogrammer. Le décodage dynamique avec des variables globales est un trou de sécurité; Si vous voulez un ensemble de variables définies par l'utilisateur, alors vous voulez probablement un hachage. – rjh

2

Les variables d'instance peuvent être récupérées par cette méthode:

input = instance_variable_get("@one") 

Après cela, dans votre cas, vous aurez input égal à « 21 ».

+0

Salut, je ne sais pas si cela fonctionnerait pour ce dont j'ai besoin. Je devrais avoir quelque chose qui assignerait un certain nombre à une variable (disons la variable A) mais le nom de la variable A n'est pas connu. Le nom de la variable A est stocké dans la variable B bien que je doive utiliser la valeur de la variable B pour affecter quelque chose à la variable A. AFAICT cela ne peut pas être fait avec instance_variable_get. – hrickards

+0

@hrickards: Connaissez-vous les valeurs possibles de A? Si vous le faites, il y a un autre moyen. Mais l'intance_variable_get devrait faire ce que vous voulez! –

+0

@Niklaos Un entier compris entre et compris 1 et 49 – hrickards

Questions connexes