从 ruby 中的数组创建 key/value 散列
creating key/value hash out of array in ruby
我发现了一段旧代码,它在 ruby 中使用简单数组创建散列数据类型。我得到了大部分,除了一部分:
据我了解,@store
的每个元素都是特定 key/value 对的内存位置,作为键的函数。所以 @store[3]
通常会存储 key/value 对应于 key=3, key=53, ... 的对,通常 key % size == 3
(在这种情况下大小 = 50)。
但是,当我设置 hash[3] = 7
、hash[53] = 9
等时,@store
数组的每个元素都填充了 key/value 对,而不仅仅是索引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, [])
这将创建一个大小合适的数组,但每个元素都是相同的对象。
改变任意位置的数组中的数组,并且每个位置的变化都会很明显。
试试看
@store = Array.new
size.times { @store << [] }
每个子数组都是一个单独的对象。
编辑
@nafaa boutefer 的回答更好。该块针对数组的每个实例进行评估,因此每个子数组都是不同的对象。
@store = Array.new(size){ [] }
你可以简单地这样做
@store = Array.new(size){ [] }
每个元素都是一个单独的数组。
我发现了一段旧代码,它在 ruby 中使用简单数组创建散列数据类型。我得到了大部分,除了一部分:
据我了解,@store
的每个元素都是特定 key/value 对的内存位置,作为键的函数。所以 @store[3]
通常会存储 key/value 对应于 key=3, key=53, ... 的对,通常 key % size == 3
(在这种情况下大小 = 50)。
但是,当我设置 hash[3] = 7
、hash[53] = 9
等时,@store
数组的每个元素都填充了 key/value 对,而不仅仅是索引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, [])
这将创建一个大小合适的数组,但每个元素都是相同的对象。
改变任意位置的数组中的数组,并且每个位置的变化都会很明显。
试试看
@store = Array.new
size.times { @store << [] }
每个子数组都是一个单独的对象。
编辑
@nafaa boutefer 的回答更好。该块针对数组的每个实例进行评估,因此每个子数组都是不同的对象。
@store = Array.new(size){ [] }
你可以简单地这样做
@store = Array.new(size){ [] }
每个元素都是一个单独的数组。