Ruby - 使用字符串作为变量名来定义新变量

时间:2017-09-01 08:37:38

标签: ruby-on-rails arrays ruby string metaprogramming

我有一个字符串数组:

names = ['log_index', 'new_index']

我想要做的是从名称创建变量:

names.each { |name| name = [] } # obviously it does not do what I want

这些变量未在代码中的任何位置声明。

我怎么能这样做?

3 个答案:

答案 0 :(得分:4)

无法在Ruby中动态定义新局部变量

有可能在Ruby 1.8中使用eval 'x = 2'

您可以使用evalbinding.local_variable_set更改现有变量。

我会考虑使用hash来存储值。

答案 1 :(得分:1)

您无法在ruby中动态定义局部变量,但您可以动态定义实例变量:

names = ['log_index', 'new_index']
names.each { |name| instance_variable_set("@#{name}", []) }

这会给你:

@log_index
 => [] 
@new_index
 => [] 

您还可以使用instance_variable_get动态访问实例变量:

names = ['log_index', 'new_index']
names.each { |name| puts instance_variable_get("@#{name}").inspect }

答案 2 :(得分:0)

你可以使用这个黑客:

names.each { |name| eval "def #{name}; []; end"  }