在运行时使用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通常是不可检索的。 任何带有@或@@前缀的内容都很容易被检索到。