Ruby 创建一个填充了单独散列的数组

Ruby 创建一个填充了单独散列的数组,ruby,arrays,hash,Ruby,Arrays,Hash,我试图创建一个数组,其中每个条目在开始时都应该是一个单独的、相同的散列条目 iTabSize = 500 #protein max lenght arrTable = Array.new(iTabSize) hshTable = {"-"=>0,"B"=>0,"Z"=>0,"I"=>0,"M"=>0,"T"=>0,"N"=>0,"K"=>0,"S"=>0,"R"=>0,"V"=>0,"A"=>0,"D"=>0,"E"

我试图创建一个数组,其中每个条目在开始时都应该是一个单独的、相同的散列条目

iTabSize = 500 #protein max lenght
arrTable = Array.new(iTabSize) 
hshTable = {"-"=>0,"B"=>0,"Z"=>0,"I"=>0,"M"=>0,"T"=>0,"N"=>0,"K"=>0,"S"=>0,"R"=>0,"V"=>0,"A"=>0,"D"=>0,"E"=>0,"G"=>0,"F"=>0,"L"=>0,"Y"=>0,"X"=>0,"C"=>0,"W"=>0,"P"=>0,"H"=>0,"Q"=>0}
0.upto(iTabSize){|x| arrTable[x]= hshTable}
问题是,如果我更改数组的一个条目中的哈希,则会更新所有其他条目的哈希:/

arrTable[x][strSeq[x]] = arrTable[x][strSeq[x]] + 1
strSeq是一个包含来自散列的字母的序列。 结果是arrTable的每个x包含完全相同的值

在使用散列创建数组时,我是否做错了什么

我试过了

arrTable = Array.new {Hash.new}
arrTable[x] = Array.new
但这改变不了什么!
Tnx

我认为这应该适合你:

max_protein = 500
hash_table  = {"-"=>0,"B"=>0,"Z"=>0,"I"=>0,"M"=>0,"T"=>0,"N"=>0,"K"=>0,"S"=>0,"R"=>0,"V"=>0,"A"=>0,"D"=>0,"E"=>0,"G"=>0,"F"=>0,"L"=>0,"Y"=>0,"X"=>0,"C"=>0,"W"=>0,"P"=>0,"H"=>0,"Q"=>0}

array_table = Array.new(max_protein) { hash_table.clone }

我认为这应该适合你:

max_protein = 500
hash_table  = {"-"=>0,"B"=>0,"Z"=>0,"I"=>0,"M"=>0,"T"=>0,"N"=>0,"K"=>0,"S"=>0,"R"=>0,"V"=>0,"A"=>0,"D"=>0,"E"=>0,"G"=>0,"F"=>0,"L"=>0,"Y"=>0,"X"=>0,"C"=>0,"W"=>0,"P"=>0,"H"=>0,"Q"=>0}

array_table = Array.new(max_protein) { hash_table.clone }

斯皮克曼给出了一个很好的回答。问题是,
arrTable[x]=hshTable
确保每个数组项都指向同一个对象(hash
hshTable
)。您想要的是每个条目都有一个新对象,它是原始散列的副本
hshTable.clone
将从哈希表中为您提供一个新的(克隆的)对象。这与您的问题无关,但生成
hshTable
的一个简单方法是
hshTable[“-”,*?a..Z]。product([0])。to_h
,假设您不关心键的顺序。斯皮克曼给出了一个很好的答案。问题是,
arrTable[x]=hshTable
确保每个数组项都指向同一个对象(hash
hshTable
)。您想要的是每个条目都有一个新对象,它是原始散列的副本
hshTable.clone
将从哈希表中为您提供一个新的(克隆的)对象。这与您的问题无关,但生成
hshTable
的一个简单方法是
hshTable[“-”,*?a..Z]。product([0])。to_h
,前提是您不关心键的顺序。