Ruby:使用字符串动态创建对象

时间:2013-06-16 00:03:19

标签: ruby object dynamic

如何使用字符串或符号创建新变量||对象?假设我想要一个已经制作的项目类的5个唯一对象;

for x in 1..5
    item_x = item.new()   #where x is obviously the number value of the iterator
end

我尝试过以这种方式使用eval():

for x in 1..5
    eval( "item_" << x << "= item.new()")
end

希望将我想要执行的字符串放入eval中,就好像把它放到代码中一样。

我已经搜索了动态对象创建,并没有找到任何人有这个问题,对不起,如果这是平凡的东西。我找到了使用.const_get和Openstruct的人的引用,但这些似乎没有以我能理解的方式解决我的问题。

2 个答案:

答案 0 :(得分:3)

您有什么理由不能将对象存储在数组中吗?这将使它们更容易创建和访问:

items = []

5.times do
  items << Item.new()
end

然后代替item_1item_5item[0]item[4]

那就是说,如果你确实需要/想要做的事情,instance_variable_set是一个选项,如果实例变量(@)是可以的:

for x in 1..5
  self.instance_variable_set("@item_#{x}", Item.new())
end

我建议只是坚持使用数组。

更新:根据您的评论,听起来您的实际用例涉及不连续的所需变量名称。在这种情况下,我使用Hash而不是数组。

以这种方式思考:无论您希望将哪个字符串用作局部变量的名称,只需将其用作本地哈希中的键即可。我无法想到任何不会比你尝试的更好的例子,即使你正在尝试的是什么。

答案 1 :(得分:1)

您可以使用instance_variable_set以您描述的方式创建实例变量:

for x in 1..5
    variable_name = "item_#{x}"
    instance_variable_set("@#{variable_name}", "value to assign to variable")
end

puts @item_1 #=> "value assigned to item_1"

但请注意,这将创建局部变量。