繁体   English   中英

在Ruby中创建数组之外的键/值哈希

[英]creating key/value hash out of array in ruby

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

据我所知, @store每个元素都是特定键/值对的存储位置,具体取决于键。 因此, @store[3]通常会存储与key = 3,key = 53,...对应的键/值对,并且通常在其中key % size == 3 (在这种情况下为size = 50)存储。

但是,当我设置hash[3] = 7hash[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

尽管您的问题尚不清楚,但我可以猜到问题是什么。

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

这将创建一个大小合适的数组,但是每个元素都是SAME OBJECT。

在任何位置更改一个数组中的数组,该更改在每个位置都会很明显。

试试吧

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

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

编辑

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

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

你可以简单地做到这一点

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM