Использование значения переменной в качестве имени другой переменной в Ruby - PullRequest
20 голосов
/ 27 марта 2010

Я только начинаю изучать Ruby и написал программу, которая генерирует некоторые числа и присваивает их переменным @one, @two, @three и т. Д. Затем пользователь может указать переменную, которую нужно изменить, введя ее имя (например, один). Затем мне нужно сделать что-то вроде '@ [valueofinout] = asd'. Как бы я это сделал, и есть ли лучший способ, поскольку способ, о котором я думаю, кажется обескураженным? Я нашел

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

но я не совсем понимаю, зачем нужна вторая строка. В моем случае я бы использовал что-то вроде

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

Ответы [ 2 ]

31 голосов
/ 27 марта 2010

Использование instance_variable_set ( rubydoc )

instance_variable_set("@" + varname, value)

В большинстве случаев вы должны отделить ваши обычные переменные Ruby от переменных, с которыми взаимодействует ваш пользователь. Как насчет создания хэша пользовательских переменных, например

@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 
2 голосов
/ 27 марта 2010

Переменные экземпляра можно получить с помощью этого метода:

input = instance_variable_get("@one")

После этого в вашем случае вы получите input, равный "21".

...