在运行时使用字符串作为变量

时间:2009-05-19 06:27:26

标签: ruby string

我有一个字符串,它是在运行时创建的。我想使用此字符串作为变量来存储一些数据。如何将字符串转换为变量名?

6 个答案:

答案 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)

如果您已先声明变量,则可以使用eval()

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

以下是docs

答案 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描述的技术。

局部变量通常无法检索。任何带有@或@@前缀的东西都可以轻松检索。