【问题标题】:ruby - error occurred while evaluating nil.[]= ... how to iterate thru multi-dimensional arrayruby - 评估 nil.[]= 时发生错误...如何遍历多维数组
【发布时间】:2012-01-03 21:49:15
【问题描述】:

我有一个名为my_ids_and_names的多维数组
它可能应该是一个散列,但现在让我们将其保留为一个数组:)

我创建它:my_own_array = Array.new[10],[2]

我有一个变量 @my_ids,它有我想要的 id。

我用这样的方法填充它:

# Setup
@my_ids_and_names = Array.new[10],[2]
@my_ids.each do |cid|
  @my_ids_and_names[cid][1] = my_id
  @my_ids_and_names[cid][2] = MyModel.find(my_id).internal_name
end
@my_ids_and_names

现在我想检索视图中的信息。
我正在尝试:

<% @campaign_ids_and_names.each do |cid, nm| %>
  "various bits of code..."
  var_for_id = cid
  var_for_nm = nm
<% end %>

cid和nm会设置正确吗?

我希望循环能够像在

中一样吐出 cid/名称
id  name
4   brick
9   tile
45  grout

现在我在setup 中得到The error occurred while evaluating nil.[]=

【问题讨论】:

    标签: ruby-on-rails ruby arrays multidimensional-array iterator


    【解决方案1】:

    如果您启动irb 控制台,您会看到Array.new[10],[2] 没有创建您想要的数组,而是创建了以下数组:

    [nil, [2]]
    

    如果要创建一个包含 10 个数组元素的新数组,请使用以下构造函数:

    Array.new(10, [])
    

    更新 1

    但是在进一步阅读您的问题时,我可以看到您需要 Hash 而不是 Array,并且您应该记住,ruby 从 0 而不是 1 开始索引。

    所以:

    @my_ids_and_names = Hash.new
    @my_ids.each do |cid|
      @my_ids_and_names[cid] = Array.new
      @my_ids_and_names[cid][0] = my_id
      @my_ids_and_names[cid][1] = MyModel.find(my_id).internal_name
    end
    @my_ids_and_names
    

    可以进一步简化为:

    @my_ids_and_names = {}
    @my_ids.each do |cid|
      @my_ids_and_names[cid] = [ my_id, MyModel.find(my_id).internal_name ]
    end
    @my_ids_and_names
    

    更新 2

    但这不适用于您提供的 each 循环,因此我将使用以下代码:

    @my_ids_and_names = {}
    @my_ids.each do |cid|
      @my_ids_and_names[cid] = MyModel.find(my_id).internal_name
    end
    @my_ids_and_names
    

    这将创建一个Hash,其中包含cid 键和MyModelsinternal_name 作为值。

    【讨论】:

    • +1 已接受。听起来不错,然后我会使用哈希。我对二维数组更熟悉,但我想是时候考虑更多红宝石了。我一直认为哈希是关联数组,但我猜语法必须是正确的:)
    • 我也喜欢 Update 2,我打算使用它,因为它看起来更干净。谢谢!
    • btw 是 @my_ids_and_names[cid] = [ my_id, MyModel.find(my_id).internal_name ] @my_ids_and_names{cid =&gt; MyModel.find(my_id).internal_name } 相同,并且在我的 .each 循环输出中仍然可以正常工作吗?
    • 这不一样,因为它们是不同的对象。但是,是的,也许.each 循环会起作用。
    猜你喜欢
    • 2015-09-26
    • 2012-04-10
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2014-10-03
    • 2012-04-16
    相关资源
    最近更新 更多