【问题标题】:creating key/value hash out of array in ruby在 ruby​​ 中从数组中创建键/值哈希
【发布时间】:2015-04-19 03:43:18
【问题描述】:

我遇到了一段旧代码,它使用 ruby​​ 中的简单数组创建哈希数据类型。我得到了大部分,除了一部分:

据我了解,@store 的每个元素都是特定键/值对的内存位置,作为键的函数。所以@store[3] 通常会存储对应于 key=3, key=53, ... 的键/值对,并且通常在 key % size == 3 的位置(在这种情况下大小 = 50)。

但是,当我设置hash[3] = 7、hash[53] = 9 等时,@store 数组的每个元素都填充了键/值对,而不仅仅是索引 3 元素。似乎 []=(key, value) 方法中的行 @store[store_key] << [key, value] 正在将 [key, value] 添加到 @store 的每个元素,而不仅仅是索引 store_key 的元素。有什么想法吗?

class SimpleHash
  attr_accessor :size, :store

  def initialize(size)
    @size = size
    @store = Array.new(size, [])
  end

  def []=(key, value)
    store_key = key % @size
    index = find_key(key, @store[store_key])
    if index
      @store[store_key][index][1] = value
    else
      p "***********************************"
      p @store
      @store[store_key] << [key, value]
      p "after"
      p store_key
      p @store
    end
  end
end

hash = SimpleHash.new(50)
p hash
hash[3] = 5
p hash
hash[3] = 7
hash[53] = 9
hash[103] = 11
hash[104] = 11

【问题讨论】:

    标签: ruby arrays data-structures hash


    【解决方案1】:

    你可以这样做

    @store = Array.new(size){ [] }
    

    每个元素都是一个单独的数组。

    【讨论】:

      【解决方案2】:

      虽然你的问题有点不清楚,但我可以猜到问题所在。

      @store = Array.new(size, [])
      

      这会创建一个大小合适的数组,但其中每个元素都是相同的对象。

      在任意位置更改array-within-an-array,每个位置的变化都会很明显。

      试试吧

      @store = Array.new
      size.times { @store << [] }
      

      这样,每个子数组都将是一个单独的对象。

      编辑

      @nafaa boutefer 的回答更好。该块会针对数组的每个实例进行评估,因此每个子数组都是不同的对象。

      @store = Array.new(size){ [] }
      

      【讨论】:

      • 不得不编辑这个,对不起!我原来的解决方案不起作用:/
      • 这是非常不习惯的。惯用的方法是使用Array::new 的块形式,如@Nafaa's answer。
      猜你喜欢
      • 2022-01-10
      • 2020-07-02
      • 2012-11-23
      • 2023-03-21
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      相关资源
      最近更新 更多