-2

我有一堂课叫Team. 我正在尝试创建它的许多实例并调用它们team1team2等等。我正在尝试类似的东西

for x in (1..20)
  instancename="team#{x}"
  instancename=Team.new
end

我正在获取字符串的内存地址,例如"Team:0x007f949b01d3f8". 我想我必须使用instance_variable_set,但我很难弄清楚语法。

4

1 回答 1

2

TL;博士

你可以用Kernel#evalObject#instance_variable_set做你想做的事。您也可以直接生成集合。如果您的需求要复杂得多,那么您可能需要考虑替代数据结构。

使用评估

您部分处于正确的轨道上,因为您需要在当前范围内定义变量。虽然有很多方法可以做到这一点,但以下方法将起作用:

Team = Struct.new :foo
for x in (1..20) do
  eval "\@team#{x} = Team.new"
end

这将创建您的实例变量:

@team20
#=> #<struct Team foo=nil>

使用插值。

没有评估的插值

当然,还有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>]

这些都不需要唯一的变量名。如果您确实需要区分它们,您可以使用数组位置或对象属性。

于 2013-08-25T23:56:07.013 回答