如何使用字符串插值按顺序命名对象的实例



我有一个名为Team的类。我正在尝试创建它的许多实例,并将它们称为team1team2等。我正在尝试类似的东西

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>]

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

相关内容

  • 没有找到相关文章

最新更新