在使用each_with_index循环时,如何将索引合并到变量名中?

C.J*_*eau 2 ruby ruby-on-rails

如何将索引合并到变量名中,以便我可以访问不同的组对象?

这是我的db/seeds.rb文件:

u = User.create( email: "yeah@foo.com", password: "yeah", password_confirmation: "yeah")

groups_list = ["Math Club", "Science Class", "Economics Class"]

groups_list.each_with_index do |name, index|
  "g#{index}" = u.groups.create(name: name)
end
Run Code Online (Sandbox Code Playgroud)

cor*_*ard 7

当你开始需要动态定义的局部变量时,你会有代码味道,并且你知道你应该重新考虑你正在做什么.

看起来你会更好地通过map调用,将groups_list一个字符串数组转换为一个Group属于u以下对象的数组:

groups_list.map { |name| u.groups.create name: name }
#=> [<Group name="Math Club">, …]
Run Code Online (Sandbox Code Playgroud)

然后你可以迭代组或将它们作为数组传递给另一个方法,不涉及任何技巧.

  • 好吧,这不完全正确,`/(?<bar>.*)/ =〜"42"`将创建一个名为`bar`的局部变量,其字符串值为"42".一个`foo ='baz'; /(?<#{foo}>.*)/ =〜"42"`不起作用.我强烈建议**不要**在生产代码中执行此操作,如果您希望在焦点消失后再次理解该代码;-) (2认同)
  • 我很难过,我建议不要使用这个功能(在[MatchData`]之外(http://ruby-doc.org/core-2.0/MatchData.html)对象,当然,命名的捕获是如此之多与$ 1`等相比,工作更舒适.无论如何,我刚刚提到捕获技巧与"Ruby不支持dyn.def.变量"相矛盾,我确信我可以通过`eval`或[RubyVM :: InstructionSequence](http)生成另一个局部变量://ruby-doc.org/core-2.0/RubyVM/InstructionSequence.html):-)无论如何,我有一种感觉,我不能再偏离主题:-)) (2认同)