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

36 ruby string

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

And*_*ack 55

如果您可以在变量名前面原谅@符号,则以下内容将起作用:

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

这将创建一个名为的变量@whatever,其值设置为:something.的:something,清楚的,可能是你想要的任何东西.这看起来在全局范围内起作用,通过声明一个自发的Object实例来绑定一切(我找不到这个的参考).

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

instance_variable_get("@#{variable_name}")
Run Code Online (Sandbox Code Playgroud)

  • FTR,你也可以使用`binding.local_variable_get("variable_name")`如果你在Ruby 2.1上,但我不推荐它. (2认同)

Tim*_*van 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
Run Code Online (Sandbox Code Playgroud)

这有几个好处.首先,这意味着你没有做任何可能后来难以弄清楚的魔法.其次,你正在使用一个非常常见的Ruby习惯用法,它在整个Rails中用于类似的功能.


Gor*_*son 9

如果eval()你已经首先声明了你的变量,你可以使用它:

>> foo = []
>> eval("foo")[1] = "bar"
>> foo[1]
=> "bar"
Run Code Online (Sandbox Code Playgroud)

这是文档.


uma*_*uma 6

现在只需使用 instance_variable_set 方法,您就可以在运行时创建实例变量。

instance_variable_set('@' + 'users', User.all)
Run Code Online (Sandbox Code Playgroud)


Jas*_*ins 5

我并不是说要消极,而是谨慎行事.Ruby为高度动态的编程提供了许多功能,例如define_method,将块存储为Proc稍后要调用的对象等.通常这些代码更清晰,更安全.99%的使用时间eval()都是错误的.

绝对不要eval()在包含用户提交的输入的字符串上使用.