Ruby 具有运行时决定长度的二维哈希数组
Ruby 2d array of hashes with runtime-decided length
我正在尝试在 ruby 模块中做这样的事情:
def initialize
super
@@main_array = Array.new(16) { Array.new}
end
def add_hash(hash={})
@@main_array[get_id] << hash
end
# Where get_id returns 0-15
我希望每个子数组都只有添加到其中的哈希值。相反,所有子数组都添加了所有哈希值。检查数组显示子数组都共享对象 ID。
我不确定为什么会这样。我在这里错过了什么?
编辑:
这是我使用的确切代码:
module Manager
def initialize
super
@@main_array = Array.new(BaseCompany.get_number_thread(), Array.new())
end
def self.check_and_add_thread_activity(activity={})
action = Hash.new
action[:id] = @@main_array[BaseCompany.get_current_threadid].length +1
action[:name] = activity[:name]
action[:added] = true
@@main_array[BaseCompany.get_current_threadid] << action
return action
end
end
Check_and_add 被代码的其他部分调用,因为各个线程执行功能
好的,其实我已经解决了。在下面的评论中有人提到:
Array.new(16,Array.new)
会导致子数组具有相同的对象 ID。其他人纠正他说这不应该发生,但在我的代码中就是这种情况。我将该行替换为推荐的:
Array.new(16) {Array.new}
这很好用。
作为参考,我使用的是 JRuby 1.7.3
Array.new(大小,对象)
main_array = Array.new(16, Array.new)
等同于:
row = Array.new
main_array = Array.new(16,row)
或者只是
main_array = [row, row, row, row, row, row, row, row, row, row, row, row, row, row, row, row]
所以你有 16 次完全相同的对象(一个空数组)。修改一个元素将自动修改所有其他元素:
p main_array
#=> [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []]
row << 1
p main_array
#=> [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
Array.new(尺码){ }
main_array = Array.new(16){ Array.new }
等同于:
main_array = (1..16).map{ Array.new }
或:
main_array = [Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new]
现在你有 16 个空数组,但它们都是不同的对象。修改一个元素不会修改任何其他数组:
main_array = Array.new(16){ Array.new }
p main_array
#=> [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []]
main_array[0] << 1
p main_array
#=> [[1], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []]
我正在尝试在 ruby 模块中做这样的事情:
def initialize
super
@@main_array = Array.new(16) { Array.new}
end
def add_hash(hash={})
@@main_array[get_id] << hash
end
# Where get_id returns 0-15
我希望每个子数组都只有添加到其中的哈希值。相反,所有子数组都添加了所有哈希值。检查数组显示子数组都共享对象 ID。
我不确定为什么会这样。我在这里错过了什么?
编辑:
这是我使用的确切代码:
module Manager
def initialize
super
@@main_array = Array.new(BaseCompany.get_number_thread(), Array.new())
end
def self.check_and_add_thread_activity(activity={})
action = Hash.new
action[:id] = @@main_array[BaseCompany.get_current_threadid].length +1
action[:name] = activity[:name]
action[:added] = true
@@main_array[BaseCompany.get_current_threadid] << action
return action
end
end
Check_and_add 被代码的其他部分调用,因为各个线程执行功能
好的,其实我已经解决了。在下面的评论中有人提到:
Array.new(16,Array.new)
会导致子数组具有相同的对象 ID。其他人纠正他说这不应该发生,但在我的代码中就是这种情况。我将该行替换为推荐的:
Array.new(16) {Array.new}
这很好用。
作为参考,我使用的是 JRuby 1.7.3
Array.new(大小,对象)
main_array = Array.new(16, Array.new)
等同于:
row = Array.new
main_array = Array.new(16,row)
或者只是
main_array = [row, row, row, row, row, row, row, row, row, row, row, row, row, row, row, row]
所以你有 16 次完全相同的对象(一个空数组)。修改一个元素将自动修改所有其他元素:
p main_array
#=> [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []]
row << 1
p main_array
#=> [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
Array.new(尺码){ }
main_array = Array.new(16){ Array.new }
等同于:
main_array = (1..16).map{ Array.new }
或:
main_array = [Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new, Array.new]
现在你有 16 个空数组,但它们都是不同的对象。修改一个元素不会修改任何其他数组:
main_array = Array.new(16){ Array.new }
p main_array
#=> [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []]
main_array[0] << 1
p main_array
#=> [[1], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []]