【问题标题】:Create variable that is named from #{}?创建从 #{} 命名的变量?
【发布时间】:2013-07-17 18:47:49
【问题描述】:

我有以下代码:

3.times do |n|
    "project#{n}" = FactoryGirl.create(:project, :title => "Project #{n}")
end

这显然行不通...有谁知道如何制作循环,我可以在其中制作变量名称,该变量名称将随“局部循环变量”而改变,以制作很多变量,如 project1、project2、projekt3?

【问题讨论】:

  • 具体想做什么?创建任意变量似乎有点傻,因为您的源代码要么 (a) 需要根据工厂的数量进行更改,要么 (b) 始终使用 send 和动态构造的名称。重点是什么? 另外Factory Girl has sequences 已经有了,您甚至不需要手动执行此操作。
  • 最好的方法是使用数组并由FactoryGirl.create_list(:project)创建。
  • 我向你保证,即使你绝对确定你需要动态创建变量标识符,你也大错特错。

标签: ruby


【解决方案1】:

你可以使用哈希吗?

project = {}
3.times do |n|
    project[n] = FactoryGirl.create(:project, :title => "Project #{n}")
end

您可以通过project[1] 访问数据...

【讨论】:

  • 具有不同键/值对的哈希通常比 一堆变量 反模式更容易使用。在这种情况下,即使是 Array 也会更好,因为键始终是数字。
  • 如果你想要一些糖 project["project#{n}".to_sym] = .... 那么你可以访问它作为 project[:project1]、project[:project2] 等等...
【解决方案2】:

您可以按照 knut 的建议使用哈希,也可以使用数组——因为您从 0 开始并连续向上移动。

project = Array.new(3)
3.times do |n|
  project[n] = FactoryGirl.create(:project, :title => "Project#{n}")
end

或者,更简单地说:

project = []
3.times do |n|
  project << FactoryGirl.create(:project, :title => "Project#{n}")
end

【讨论】:

    【解决方案3】:

    这提供了你在问什么的错觉......

    eigenclass = class << self; self; end
    3.times do |n|
      eigenclass.class_eval { attr_accessor "project#{n}" }
      eval "self.project#{n} = FactoryGirl.create(:project, :title => \"Project #{n}\")"
    end
    

    但请不要这样做。它实际上是在Kernel 上创建一个属性访问器,每个n 值一个。

    Here是我的参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      • 2011-10-13
      • 1970-01-01
      相关资源
      最近更新 更多