【问题标题】:Problem with multidimensional arrays in ruby [duplicate]ruby中多维数组的问题[重复]
【发布时间】:2010-04-06 03:06:22
【问题描述】:

ruby 1.8.7 (2008-08-11 补丁级别 72) [i586-linux]

来自脚本/控制台:

>> pairs = Array.new(2).map!{Array.new(2).map!{Array.new(2, Array.new)}}
=> [[[[], []], [[], []]], [[[], []], [[], []]]]
>> pair = Pair.first
=> #<Pair id: 39, charge_card_id: 1, classroom_id: 1, timeslot_id: 1, created_at: "2010-04-01 00:45:37", updated_at: "2010-04-01 00:45:47">
>> pairs[0][0][0] << pair
=> [#<Pair id: 39, charge_card_id: 1, classroom_id: 1, timeslot_id: 1, created_at: "2010-04-01 00:45:37", updated_at: "2010-04-01 00:45:47">]
>> pairs[0][0]
=> [[#<Pair id: 39, charge_card_id: 1, classroom_id: 1, timeslot_id: 1, created_at: "2010-04-01 00:45:37", updated_at: "2010-04-01 00:45:47">], [#<Pair id: 39, charge_card_id: 1, classroom_id: 1, timeslot_id: 1, created_at: "2010-04-01 00:45:37", updated_at: "2010-04-01 00:45:47">]]
>>

所以问题是为什么pair对象出现在pairs[0][0][0]和pairs[0][0][1]中,尽管我没有要求它出现在那里。请注意,我不需要对 pairs[0][0][0] = pair - 我希望它作为第一个数组成员,所以我需要使用

【问题讨论】:

    标签: ruby arrays


    【解决方案1】:

    首先,你想要

    pairs = Array.new(2) { Array.new(2) { Array.new(2) { [] }}}
    

    而不是你得到的。两个主要区别:

    • 您为自己保存了#map!来电
    • 在您的示例中,“Array.new(2, Array.new)”正在创建用于 both 索引的 one 数组,因此您指的是相同的数组两次。通过使用块语法,您可以确保每个索引都有一个单独的 Array 实例

    【讨论】:

      【解决方案2】:

      现在适用于:

      pairs = Array.new(2).map!{Array.new(2).map!{Array.new(2).map!{Array.new}}}
      

      我认为这是因为最深的数组只是指向内存指针的链接。

      【讨论】:

        【解决方案3】:

        Array.new(2, Array.new) 为您提供一个大小为 2 的数组,在索引 0 和索引 1 处具有相同空数组对象的副本。如果您希望它们是不同的对象,请使用 map!,就像您在更高的层次。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-17
          • 2011-11-27
          • 2013-03-09
          • 2014-05-26
          • 1970-01-01
          • 2013-04-26
          • 2014-01-12
          • 2014-07-20
          相关资源
          最近更新 更多