我有一个字符串,它是在运行时创建的。我想使用此字符串作为变量来存储一些数据。如何将字符串转换为变量名?
答案 0 :(得分:54)
如果您可以在变量名前面原谅@符号,则以下内容将起作用:
variable_name = ... # determine user-given variable name
instance_variable_set("@#{variable_name}", :something)
这将创建一个名为@whatever
的变量,其值设置为:something
。 :something
显然可以是你想要的任何东西。这似乎在全局范围内起作用,通过声明一个自发的Object
实例来绑定所有内容(我无法找到对此的引用)。
instance_variable_get
方法可让您以相同的方式按名称检索值。
instance_variable_get("@#{variable_name}")
答案 1 :(得分:12)
而不是直接这样做,为什么不考虑使用哈希。字符串将是键,您要存储的值将是值。像这样:
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中用于类似的功能。
答案 2 :(得分:8)
答案 3 :(得分:5)
我并不是要消极,而是谨慎行事。 Ruby为高度动态的编程提供了许多功能,例如define_method
,将块存储为Proc
对象以便稍后调用,等等。通常这些代码更清晰,更安全。 99%的时间使用eval()
是错误的。
绝对不要在包含用户提交的输入的字符串上使用eval()
。
答案 4 :(得分:3)
现在只需使用instance_variable_set方法,就可以在运行时创建一个实例变量。
instance_variable_set('@' + 'users', User.all)
答案 5 :(得分:0)
正如Jason Watkins所说,很多人可能会很快使用eval(),这将是一个严重的错误。大多数情况下,如果您已经注意使用类实例变量而不是本地变量,则可以使用Tack描述的技术。
局部变量通常无法检索。任何带有@或@@前缀的东西都可以轻松检索。