在运行时使用string作为variables

我有一个string,它是在运行时创build的。 我想用这个string作为variables来存储一些数据。 如何将string转换为variables名?

如果您可以原谅variables名称前面的@符号,则以下操作将起作用:

variable_name = ... # determine user-given variable name instance_variable_set("@#{variable_name}", :something) 

这将创build一个名为@whatever的variables,其值设置为:something 。 这个:something显然可以是你想要的任何东西。 这似乎在全局范围内工作,通过声明一个自发的Object实例绑定的一切(我找不到这个参考)。

instance_variable_get方法将允许您以相同的方式按名称检索值。

 instance_variable_get("@#{variable_name}") 

而不是直接这样做,为什么不考虑使用散列代替。 该string将是关键,并且您想要存储的值将是值。 像这样的东西:

 string_values = { } some_string = params[:some_string] # parameter was, say "Hello" string_values[some_string] = 42 string_values # { 'Hello' => 42 } some_number = string_values[some_string] some_number # 42 

这有几个好处。 首先,这意味着你没有做任何可能难以理解的魔法。 其次,你使用了一个非常常见的Ruby习惯用法,用于整个Rails的类似function。

如果你已经声明了你的variables,你可以使用eval()

 >> foo = [] >> eval("foo")[1] = "bar" >> foo[1] => "bar" 

这里是文档 。

我并不是说要消极,而是谨慎行事。 Ruby为你提供了很多高度dynamic编程的特性,例如define_method ,将块存储为稍后调用的Proc对象等等。通常,这些代码更简洁,更安全。 99%的时间使用eval()是一个错误。

绝对不要在包含用户提交的input的string上使用eval()

现在只需使用instance_variable_set方法,就可以在运行时创build一个实例variables。

 instance_variable_set('@' + 'users', User.all) 

正如Jason Watkins所说,很多人可能会首先使用eval(),这将是一个严重的错误。 大多数情况下,如果您使用类实例variables而不是本地类,则可以使用Tack描述的技术。

局部variables通常是不可检索的。 任何带有@或@@前缀的内容都很容易被检索到。