在ruby中从数组中创建键/值哈希

时间:2015-02-18 07:49:48

标签: ruby arrays data-structures hash

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

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

但是,当我设置hash[3] = 7hash[53] = 9等时,@store数组的每个元素都会填充键/值对,而不仅仅是索引3元素。似乎方法@store[store_key] << [key, value]中的行[]=(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

2 个答案:

答案 0 :(得分:1)

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

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

创建一个正确大小的数组,但每个元素都是相同的对象。

在任何位置更改阵列内的阵列,并且每个位置的变化都很明显。

尝试改为

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

每个子数组都是一个单独的对象。

修改

@nafaa boutefer的答案更好。为每个数组实例计算块,因此每个子数组都是不同的对象。

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

答案 1 :(得分:1)

你可以简单地这样做

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

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