Переменные экземпляра имени динамически Ruby

Что я хочу сделать, так это динамически именовать переменные:

def instance(instance)
    @instance = instance #@instance isn't actually a variable called @instance, rather a variable called @whatever was passed as an argument
end

Как я могу это сделать?

3 ответа

Решение

Вы не можете на самом деле.

Вы могли бы поиграть с eval, но на самом деле это не будет читабельным.

Используйте правильный if или используйте вместо этого хеш.

# With Hash:
values = {}
a = :foo
values[a] = "bar"
values[:foo] # => "bar"

# With if
calc = "bar"
if a_is_foo
  foo = calc
else
  oof = calc
end
foo # => "bar"

Использование instance_variable_set,

varname = '@foo'
value = 'bar'
self.instance_variable_set varname, value
@foo   # => "bar"

Или, если вы не хотите, чтобы вызывающий абонент вводил '@':

varname = 'foo'
value = 'bar'
self.instance_variable_set "@#{varname}", value
@foo   # => "bar"

Если я правильно понимаю, вы хотите использовать "instance_variable_set":

class A
end

a = A.new
a.instance_variable_set("@whatever", "foo")

a.instance_variable_get("@whatever") #=> "foo"
Другие вопросы по тегам