我有一个名为Team
的类。我正在尝试创建它的许多实例,并将它们称为team1
、team2
等。我正在尝试类似的东西
for x in (1..20)
instancename="team#{x}"
instancename=Team.new
end
我正在获取类似"Team:0x007f949b01d3f8"
的字符串的内存地址。我想我必须使用instance_variable_set
,但我很难弄清楚语法。
TL;DR
您可以使用Kernel#eval或Object#instance_variable_set执行您想要的操作。您也可以直接生成集合。如果您的需求要复杂得多,那么您可能需要考虑其他数据结构。
使用Eval
您需要在当前范围中定义变量,这在一定程度上是正确的。虽然有很多方法可以做到这一点,但以下方法将起作用:
Team = Struct.new :foo
for x in (1..20) do
eval "@team#{x} = Team.new"
end
这将创建您的实例变量:
@team20
#=> #<struct Team foo=nil>
使用插值。
无Eval插值
当然,Kernel#eval还有其他选择,比如Object#instance_variable_set。考虑这个例子:
Team = Struct.new :foo
(1..20).each { |i| instance_variable_set "@team#{i}", Team.new }
我真的看不出它在您的特定情况下有多大区别,但这允许您在对变量名进行插值的同时避免#eval。
使用集合
既然我无法想象你会如何将其用作集合之外的任何东西,那么你不妨首先创建一个集合。例如:
Team = Struct.new :team_id
teams = (1..20).map { |i| Team.new i }
teams[9]
#=> #<struct Team team_id=10>
如果你愿意的话,你甚至可以在你的收藏中找到一些有价值的团队。例如:
teams.select { |t| t.team_id == 10 }
#=> [#<struct Team team_id=10>]
所有这些都不需要唯一的变量名。如果确实需要区分它们,可以使用数组位置或对象属性。