如何调用动态生成的实例?

时间:2012-07-03 13:17:50

标签: ruby

我正在寻找生成动态变量,如下所示:

varnum = rand(100000)
value = 5
instance_variable_set("@v" + varnum.to_s, value)

现在,在IRB中,如果varnum返回345 - 您可以推断生成的变量是@ v345

但是,在脚本中运行代码 - 您将如何调用它?有没有办法用@v + varnum.to_s?

修补变量

3 个答案:

答案 0 :(得分:4)

如果没有将变量赋值给任何东西,遗憾的是,没有一种确切的方法可以获得它。如果是这种情况,您只需使用instance_variable_get

即可

如果您只使用此技术一次,您可以通过某种间接方式获得它。即给它一个特殊的名字...... v代表

ree-1.8.7-2011.03 :015 > instance_variables
 => ["@v48563", "@prompt"]

您可以使用正则表达式为此添加grep。

ree-1.8.7-2011.03 :016 > instance_variables.grep(/@v/)
 => ["@v48563"] 

答案 1 :(得分:1)

instance_variable_get("@v" + varnum.to_s)

这会调用已定义的实例变量

答案 2 :(得分:1)

好吧,如果您想再次访问该变量,则必须执行以下两项操作之一:

  • 保留您动态生成的所有实例变量的数组
  • 使用Object#instance_variables获取实例变量列表,并仅取出以v开头的变量。

要在变量仍具有值后访问变量,请使用:

instance_variable_get("@v#{varnum.to_s}")

但这里有一个更深层次的问题。你应该从不永远永远动态生成实例变量。如果您需要通过随机数访问数据作为对象的一部分,请使用一个实例变量,比如@vs,这是一个哈希映射随机数值。